感谢您对以下问题的帮助。 让我们使用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类
的实例获取PlaceQuerySetPlaceQuerySet[<Pub object ><Pub object >]
但我仍然会收到PlaceQuerySet而不是PubQuerySet ......
非常感谢您的帮助
Jano的