You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从父模型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多态模型的第三方库,能让父类查询直接返回子类实例:

  1. 安装依赖:
pip install django-polymorphic
  1. 在项目settings.py的INSTALLED_APPS中添加:
INSTALLED_APPS = [
    # ... 其他应用
    'polymorphic',
]
  1. 修改父类模型继承PolymorphicModel:
from polymorphic.models import PolymorphicModel

class BaseModel(PolymorphicModel):
    approved = models.BooleanField()
  1. 直接查询父类即可得到子类实例:
approved_instances = BaseModel.objects.filter(approved=True)

这个查询集保留了Django QuerySet的所有特性(分页、排序、过滤等),是最简洁的方案。

内容的提问来源于stack exchange,提问作者nathan lachenmyer

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.26 21:37:41