Python Django-多表继承-与子类的反向关系

Python Django-多表继承-与子类的反向关系,python,django,downcast,multi-table-inheritance,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

我将感谢您对以下问题的帮助。 让我们使用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”具有指向“Owner”对象的链接。QuerySet(PlaceQuerySet、RestaurantQuerySet、PubQuerySet)具有与模型(Place、Restaurant、Pub)相同的继承层次结构

我面临的挑战是如何检索只包含链接到特定所有者的发布对象的PubQuerySet


我知道我需要的一种方法是将owned_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 >....]
我将获得带有Pub类实例的PlaceQuerySet

PlaceQuerySet[<Pub object ><Pub object >]
PlaceQuerySet[]
但我还是会收到PlaceQuerySet而不是PubQuerySet

非常感谢你的帮助


Jano

我无法想象为什么queryset课程很重要,你能解释一下吗?您只需要迭代查询集,对吗?嗨,查询集的类很重要,因为我需要在该查询集上链接更多的过滤器,而这些过滤器仅在PubQuerySet中可用。另一个原因是,如果您使用的是PlaceQUerySet,那么您只能基于Place类的成员进行筛选。谢谢你的帮助..啊,有道理,有没有办法将它转换到另一个queryset或实例化新的queryset并设置一些属性。。。
# owner is instance of Owner class
>>owner.places.select_subclasses('pub')
PlaceQuerySet[<Pub object ><Pub object >]