7
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无论是否使用模块。我只想能够返回所有子类查询集。

4

2 回答 2

15

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

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

上面的代码将返回所有Bars 和Restaurants,因为它使用select_subclasses.

于 2013-09-11T13:55:28.940 回答
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"> ]
于 2013-09-11T13:47:33.023 回答