django - Django lt+gt 条件与。不等条件
问题描述
我有以下型号
class P(models.Model):
name = models.CharField(max_length=30, blank=False)
class pr(models.Model):
p = models.ForeignKey(P, on_delete=models.CASCADE, related_name='cs')
r = models.CharField(max_length=1)
c = models.ForeignKey(P, on_delete=models.CASCADE, related_name='ps')
rc = models.PositiveSmallIntegerField()
class Meta:
unique_together = (('p', 'c'),)
和数据
"id","name"
69,"Hunter"
104,"Savannah"
198,"Adrian"
205,"Andrew"
213,"Matthew"
214,"Aiden"
218,"Madison"
219,"Harper"
---
"id","r","rc","c_id","p_id"
7556,"F",1,219,213
7557,"M",1,219,218
7559,"H",3,218,213
7572,"F",1,214,213
7573,"M",1,214,218
7604,"F",1,198,213
7605,"M",1,198,218
7788,"H",3,104,205
7789,"F",1,104,213
7790,"M",1,104,218
7866,"M",1,69,104
7867,"F",1,69,205
以下两个查询应该产生相似的结果
A = P.objects.filter(Q(Q(ps__rc__lt = 3) | Q(ps__rc__gt = 3)), ps__p__cs__c = 198).exclude(pk = 198).annotate(bt=Count('ps__rc', filter=Q(ps__rc = 1, ps__p__cs__rc = 1)))
B = P.objects.filter(~Q(ps__rc = 3), ps__p__cs__c = 198).exclude(pk = 198).annotate(bt=Count('ps__rc', filter=Q(ps__rc = 1, ps__p__cs__rc = 1)))
奇怪的是;查询 A 产生预期结果,但 B 缺少模型实例 104!经过进一步的故障排除后,我发现查询 B 生成了以下 SQL:
SELECT "eftapp_p"."id", "eftapp_p"."name", COUNT("eftapp_pr"."rc") FILTER (WHERE (T4."rc" = 1 AND "eftapp_pr"."rc" = 1)) AS "bt" FROM "eftapp_p" LEFT OUTER JOIN "eftapp_pr" ON ("eftapp_p"."id" = "eftapp_pr"."c_id") LEFT OUTER JOIN "eftapp_p" T3 ON ("eftapp_pr"."p_id" = T3."id") LEFT OUTER JOIN "eftapp_pr" T4 ON (T3."id" = T4."p_id") WHERE (NOT ("eftapp_p"."id" IN (SELECT U1."c_id" FROM "eftapp_pr" U1 WHERE U1."rc" = 3)) AND T4."c_id" = 198 AND NOT ("eftapp_p"."id" = 198)) GROUP BY "eftapp_p"."id"
是否有一种解决方法可以强制生成的 SQL 查询的 WHERE 子句为:WHERE NOT ("eftapp_pr"."rc" = 3) AND T4."c_id" = 198 AND NOT ("eftapp_p"."id" = 198) ?
Django 版本:3.0.4 Python 版本:3.7.3 数据库:x86_64-pc-linux-gnu 上的 PostgreSQL 11.9 (Debian 11.9-0+deb10u1),由 gcc (Debian 8.3.0-6) 8.3.0, 64- 编译少量
解决方案
我可能在这里遗漏了一些东西,但你不能ps__rc=3
把.exclude filter
?
推荐阅读
- python - 解析 XML 文件以转换为 CSV
- mobiscroll - mobiscroll 是否有获取星期几的方法?
- c# - Docx to byte array not saving in database
- c++ - 非模板容器迭代器
- git - 获取忽略还原的提交列表
- authentication - asp.net core 3.1 + 反应认证 AzureDB
- python - 使用 pygame,如何更新由类定义的对象的位置
- java - 为什么针对 Spanner 模拟器运行的 Spanner spring 演示无法创建池化数据库连接?
- angular - Angular 材质表异步加载数据
- spring-boot - Spring TCP 集成仅每 30+ 秒读取一次