我目前有一组这样的模型:
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-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