如何从父模型BaseModel批量获取approved=True的子模型实例?
解决Django多表继承下的多态查询问题
方法一:原生Django实现(无需第三方库)
通过ContentType动态获取所有子类,再合并查询集:
from django.contrib.contenttypes.models import ContentType from itertools import chain from .models import BaseModel # 获取所有直接继承BaseModel的子类 subclasses = [ct.model_class() for ct in ContentType.objects.get_for_models(*BaseModel.__subclasses__()).values()] # 筛选每个子类中approved=True的实例并合并 approved_instances = list(chain(*[cls.objects.filter(approved=True) for cls in subclasses]))
注意:
- 如果存在多层继承(子类还有子类),需要递归获取所有子类;
- 合并后的结果是列表而非QuerySet,若需保留QuerySet特性,可使用
QuerySet.union()(要求各子类字段结构兼容)。
方法二:使用django-polymorphic简化实现
这是专门处理Django多态模型的第三方库,能让父类查询直接返回子类实例:
- 安装依赖:
pip install django-polymorphic
- 在项目
settings.py的INSTALLED_APPS中添加:
INSTALLED_APPS = [ # ... 其他应用 'polymorphic', ]
- 修改父类模型继承
PolymorphicModel:
from polymorphic.models import PolymorphicModel class BaseModel(PolymorphicModel): approved = models.BooleanField()
- 直接查询父类即可得到子类实例:
approved_instances = BaseModel.objects.filter(approved=True)
这个查询集保留了Django QuerySet的所有特性(分页、排序、过滤等),是最简洁的方案。
内容的提问来源于stack exchange,提问作者nathan lachenmyer
相关产品推荐
相关产品推荐

