python - 来自不同模型的 Concat QuerySets
问题描述
我的模型:
class BaseModel(models.Model):
my_field = models.CharField(max_length=250)
class Meta:
abstract = True
class ModelA(BaseModel):
a_field = models.CharField(max_length=250)
class ModelB(BaseModel):
def some_function(self):
return 'some result'
现在我想对查询集执行过滤,其中查询集由 ModelA.objects.all() 和 ModelB.objects.all() 组成。
我试过了:
queryset = chain(ModelA.objects.all(), ModelB.objects.all())
接着:
queryset.filter(my_field='some_string')
但我收到以下错误:
'itertools.chain' object has no attribute 'filter'
如何将这两个模型的 QuerySet 连接为一个并仅基于 BaseModel 字段执行过滤?
解决方案
为此,您需要使用多表继承并查询 BaseModel 而不是抽象基类
BaseModel.objects.filter(my_field='some_string')
#returns a queryset of BaseModels
或者,有一个名为Django Polymorphic的第三方包,使用上述代码将返回子类模型而不是超类模型。这似乎让您最接近您正在寻找的解决方案。这是一个非常酷的包!
BaseModel.objects.filter(my_field='some_string')
#returns a queryset of ModelAs and ModelBs
推荐阅读
- pyqt - 如何在 PyQt5 固定大小的 QLabel 中放置文本?
- nginx - 错误的 CLS 指标
- python - 需要帮助使用正则表达式从错误日志中的一行中提取数据(Python)
- python - 为什么我们可以在 Python 中赋值之前使用全局变量?
- node.js - 使用节点 js 格式从 AWS lambda 发送 Json 数据
- javascript - 使用 matchMedia 的带有香草 javascript 的响应式导航
- php - Mysql 数据库花费了太长时间:严重性:警告 --> ini_set():会话处于活动状态。您目前无法更改会话模块的 ini 设置
- javascript - 树结构到平面数组Javascript
- pytorch - 从带有数据和噪声的图片中估计边界框坐标
- angular - HttpClient 忽略传递给 .get() 的标头