python - 具有多个条件的 Django Q 对象查询过滤失败
问题描述
我正在尝试将多个条件应用于我的过滤器。模型看起来像这样
class modelChat(models.Model):
source = models.ForeignKey(modelEmployer,related_name = 'rsource',on_delete=models.CASCADE,null=True,default=None,blank=True)
job = models.ForeignKey(modelJob,on_delete=models.CASCADE,null=True,default=None,blank=True)
destination = models.ForeignKey(modelEmployer,related_name = 'rdestination',on_delete=models.CASCADE,null=True,default=None,blank=True)
最初,我试图获取一个基于工作的涉及 2 方的聊天实例。在某一时刻,源可以是目的地,有时目的地可以是源。但工作保持不变。
这就是我的查询的样子
querySet = modelChat.objects.filter(
(Q(source=modelEmployerSourceInstance) | Q(destination=modelEmployerSourceInstance))
&
(Q(destination=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
&
Q(job_id=job_id)
)
作业 ID 是正确的,我知道数据库中只有一项。但是,此查询始终返回一个空项目。有什么建议为什么这是错误的以及我该如何解决?
解决方案
我不能确定这是否是问题所在,因为您忘记显示您在数据库中真正拥有的内容,但在这里:
(Q(destination=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
我假设你想要:
(Q(source=modelEmployerDestinationInstance) | Q(destination=modelEmployerDestinationInstance))
反而...
请注意,使用较短的名称,逻辑会更加明显,即source
而 destination
不是modelEmployerSourceInstance
modelEmployerDestinationInstance
:
q = (
(Q(source=source) | Q(destination=source))
& (Q(source=destination | Q(destination=destination))
& Q(job_id=job_id)
)
querySet = modelChat.objects.filter(q)
有意义的名称是一件好事,但它们必须足够简短和清晰。使用“modelEmployerXXXInstance”,您有四个单词要解析,并且名称中唯一独特(因此相关)的部分位于第三位,您的大脑往往会跳过这部分。“模型”、“雇主”和“实例”部分实际上只是噪音。
推荐阅读
- php - SQLSTATE [HY000]:一般错误:1364 字段“描述”没有默认值(SQL:插入到“项目”(...)
- keras - 什么时候应该使用 Keras 中的哪种数据格式约定(channels_last 或 channels_first)?
- java - Hive:如何用地图列分解表格
- angular - 如何重置ag-grid无限滚动
- oracle - 关于调整 oracle 触发器的查询
- angular - 在 Angular ts 中为 Web 应用程序中不同类型的用户导航路由
- javascript - Node JS:使用请求并行调用多个 API 调用
- python - 为什么我的迭代器实现效率很低?
- sql - 如何在不创建函数的情况下删除 SQL 中的非字母数字字符?
- matlab - 在 MATLAB 中进行最近邻搜索