Правильный способ возвратить образцовый экземпляр прокси из экземпляра базовой модели в Django?

Скажите, что у меня есть модели:

class Animal(models.Model):
    type = models.CharField(max_length=255)

class Dog(Animal):
    def make_sound(self):
        print "Woof!"
    class Meta:
        proxy = True

class Cat(Animal):
    def make_sound(self):
        print "Meow!"
    class Meta:
        proxy = True

Скажем, я хочу сделать:

 animals = Animal.objects.all()
 for animal in animals:
     animal.make_sound()

Я хочу возвратить серию Лая и Мяуканий. Очевидно, я мог просто определить make_sound в исходной модели, что ветвления на основе animal_type, но тогда каждый раз я добавляю новый тип животных (предполагают, что они находятся в различных приложениях), я должен был бы войти и отредактировать это функция make_sound. Я просто определил бы модели прокси, и сделайте, чтобы они определили поведение сами. Из того, что я могу сказать, нет никакого способа возвратить смешанный CAT или экземпляры Собаки, но я фигурировал, возможно, что я мог определить "get_proxy_model" метод на основном классе, который возвращает кошку или модель собаки.

Конечно, Вы могли сделать это, и передать что-то как первичный ключ и затем просто сделать Cat.objects.get (pk = passed_in_primary_key). Но это означало бы делать дополнительный запрос для данных, которые Вы уже имеете, который кажется избыточным. Там какой-либо путь состоит в том, чтобы превратить животное в кошку или экземпляр собаки эффективным способом? Что правильный путь состоит в том, чтобы сделать то, чего я хочу достигнуть?

26
задан sotangochips 7 February 2010 в 23:51
поделиться

1 ответ

Возможно, вы сможете сделать модели Django полиморфными, используя подход, описанный здесь . Я считаю, что этот код находится на ранних стадиях разработки, но его стоит изучить.

1
ответ дан 28 November 2019 в 17:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: