3

感谢您对以下问题的帮助。让我们使用 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 ...

非常感谢您的帮助

亚诺

4

0 回答 0