Django从抽象类访问子类项

时间:2013-09-11 13:40:25

标签: python django

class Animal(models.Model):
    ....
    class Meta:
        abstract = True

class Cat(models.Model, Animal):
    ...

class Dog(models.Model, Animal):
    ....

我希望能够返回Animal的所有子类的所有查询集实例。假设我有一个名为allData的函数,它返回所有子类查询集的数组/列表。

例如:

x = animal.allData()[0] # should return the first element in the array.

我不介意我们这样做,使用django-model-utils之类的模块。我只想能够返回所有子类查询集。

2 个答案:

答案 0 :(得分:16)

这在一个查询中是不可能的。您有两个选项,一个用于django-model-utils,或者您可以使用django_polymorphic

多态更适合你的任务,但是django-model-utils是由django社区的一位非常杰出的成员制作的,因此有很多好的支持。

如果我必须选择,我会选择django-model-utils,因为它是由django团队成员制作的,因此将得到支持。 Divio支持多态,这是一家私人公司,大量使用瑞士的django。

至于如何选择子类。您需要使用django-model-utils执行两项操作。首先,您需要将模型中的objects变量更改为InheritanceManager(),如此(根据文档改编):

from model_utils.managers import InheritanceManager

class Place(models.Model):
    # ...
    objects = InheritanceManager()

class Restaurant(Place):
    # ...

class Bar(Place):
    # ...

nearby_places = Place.objects.filter(location='here').select_subclasses()
for place in nearby_places:
    # "place" will automatically be an instance of Place, Restaurant, or Bar

上面的代码将返回所有BarRestaurant,因为它使用select_subclasses

答案 1 :(得分:2)

您可能对django_polymorphic

感兴趣

项目文档示例:

当我们存储从Project模型继承的模型时......

>>> Project.objects.create(topic="Department Party")
>>> ArtProject.objects.create(topic="Painting with Tim", artist="T. Turner")
>>> ResearchProject.objects.create(topic="Swallow Aerodynamics", supervisor="Dr. Winter")

...想要检索我们所有的项目,返回子类模型:

>>> Project.objects.all()
[ <Project:         id 1, topic "Department Party">,
  <ArtProject:      id 2, topic "Painting with Tim", artist "T. Turner">,
  <ResearchProject: id 3, topic "Swallow Aerodynamics", supervisor "Dr. Winter"> ]