如何从父模型数据中查询子模型?

问题描述 投票:0回答:1

我目前有一组这样的模型:

class BaseModel(models.Model):
    approved = models.BooleanField()

class ModelA(BaseModel):
    # model fields

class ModelB(BaseModel):
    # models fields

class ModelC(BaseModel):
    # model fields

我想做的是获取

ModelA
ModelB
ModelC
approved=True
的所有实例的列表。

我可以使用查询集查询

BaseModel

BaseModel.objects.filter(approved=True)

但这会返回

BaseModel
的所有实例,而不是
ModelA
ModelB
ModelC
。我希望我的查询集包含每个模型的实例 - 最好不要详尽地查询
BaseModel
的每个可能的子模型。

有办法做到这一点吗?

django django-models inheritance
1个回答
0
投票

这就是

django-polymorphic
 [readthedocs.io] 所做的,但模型继承通常不是一个好主意:它会产生大量 JOIN,从而使查询速度变慢。

本质上 Django 多态将做的是查询:

BaseModel.objects.filter(approved=True).select_related(
    'modela', 'modelb', 'modelc'
)

然后会看到 JOIN 成功的原因:

for item in queryset:
    if hasattr(item, 'modela'):
        # use item.modela instead…
        pass
    if hasattr(item, 'modelb'):
        # use item.modelb instead…
        pass
    if hasattr(item, 'modelc'):
        # use item.modelc instead…
        pass
© www.soinside.com 2019 - 2024. All rights reserved.