Django - 多表继承 - 与SubClass的反向关系

时间:2013-10-06 18:37:43

标签: python django downcast multi-table-inheritance

感谢您对以下问题的帮助。 让我们使用Django文档中的模型来说明我的情况。

models.py

from django.db import models

class Place(models.Model):
    owner = DjangoModels.ForeignKey('Owner', related_name='places')
    objects = PassThroughManager.for_queryset_class(PlaceQuerySet)()

class Restaurant(Place):
    ... some members ...
    objects = PassThroughManager.for_queryset_class(RestaurantQuerySet)()

class Pub(Place):
    ... some members ...
    objects = PassThroughManager.for_queryset_class(PubQuerySet)()

class Owner(models.Model):
    ... some members ...

queryset.py

class PlaceQuerySet(DjangoModels.query.QuerySet):
    .. common place filters ...

class RestaurantQuerySet(PlaceQuerySet):
    .. restaurant specific filters ...

class PubQuerySet(PlaceQuerySet):
    .. pub specific filters ...

所以你可以看到上面我有一个基本型号'Place'和两个子型号'Restaurant'和'Pub'。 基本模型'Place'有一个指向'Owner'对象的链接。 Querysets(PlaceQuerySet,RestaurantQuerySet,PubQuerySet)具有与模型(Place,Restaurant,Pub)相同的继承层次结构。

我遇到的挑战是以某种方式检索仅包含链接到某个所有者的Pub对象的PubQuerySet ....


我知道我需要的一种方法是将own_by(所有者)过滤器添加到PubQuerySet中并调用以下内容:

Pub.objects.owned_by(owner)

但是它存在性能问题,因为'.objects'不使用预取结果,它总是命中DB。


我的想法:

当我打电话

# owner is instance of Owner class
>>owner.places.all()

它返回

PlaceQuerySet[<Place object ><Place object ><Place object >....]

但我怎么得到

PubQuerySet[<Pub object ><Pub object >]

???

我知道使用django-model-utils(1)中的select_subclasses()方法我可以在Queryset中向下转换对象,所以如果我做这样的事情

# owner is instance of Owner class
>>owner.places.select_subclasses('pub')

我会使用Pub类

的实例获取PlaceQuerySet
PlaceQuerySet[<Pub object ><Pub object >]

但我仍然会收到PlaceQuerySet而不是PubQuerySet ......

非常感谢您的帮助

Jano的

0 个答案:

没有答案