Скажите, что у меня есть модели:
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). Но это означало бы делать дополнительный запрос для данных, которые Вы уже имеете, который кажется избыточным. Там какой-либо путь состоит в том, чтобы превратить животное в кошку или экземпляр собаки эффективным способом? Что правильный путь состоит в том, чтобы сделать то, чего я хочу достигнуть?
Возможно, вы сможете сделать модели Django полиморфными, используя подход, описанный здесь . Я считаю, что этот код находится на ранних стадиях разработки, но его стоит изучить.