感谢您对以下问题的帮助。让我们使用 Django 文档中的模型来说明我的情况。
模型.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 ...
查询集.py
class PlaceQuerySet(DjangoModels.query.QuerySet):
.. common place filters ...
class RestaurantQuerySet(PlaceQuerySet):
.. restaurant specific filters ...
class PubQuerySet(PlaceQuerySet):
.. pub specific filters ...
正如您在上面看到的,我有一个基本模型“Place”和两个子模型“Restaurant”和“Pub”。基本模型“地点”具有指向“所有者”对象的链接。查询集(PlaceQuerySet、RestaurantQuerySet、PubQuerySet)与模型(Place、Restaurant、Pub)具有相同的继承层次结构。
我面临的挑战是以某种方式检索仅包含链接到某个所有者的 Pub 对象的 PubQuerySet....
我知道做我需要的一种方法是将 own_by(owner) 过滤器添加到 PubQuerySet 并调用以下内容:
Pub.objects.owned_by(owner)
但它存在性能问题,因为“.objects”不使用预取结果并且它总是命中数据库。
我的想法:
当我打电话
# 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 ...
非常感谢您的帮助
亚诺