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