Скажем, у меня есть модели:
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()
Я хочу вернуть серию Woofs и Meows. Ясно, что я мог бы просто определить make_sound в оригинальной модели, что вилки на основе animal_type, но затем каждый раз, когда я добавляю новый тип животных (представьте, что они находятся в разных приложениях), мне нужно будет войти и отредактировать эту функцию make_sound, Я бы предпочел просто определить прокси-модели и определить их поведение. Из того, что я могу сказать, нет способа вернуть смешанные экземпляры Cat или Dog, но я подумал, может быть, я могу определить метод get_proxy_model для основного класса, который возвращает модель кошки или собаки.
Конечно, вы могли бы сделать это и передать что-то вроде первичного ключа, а затем просто сделать Cat.objects.get(pk = pass_in_primary_key). Но это будет означать выполнение дополнительного запроса для данных, которые у вас уже есть, что кажется излишним. Есть ли способ превратить животное в кошку или собачий экземпляр эффективным способом? Какой правильный способ сделать то, что я хочу достичь?