python - 在过滤的查询集中获取重复的记录
问题描述
| &
我有一个像这样的过滤器有点复杂的组合。
objs = objs.annotate(num_line=Count("lns")).\
filter(Q(lns__id__in=lnIds) | (Q(sts__id__in=oIds)
& (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))))
它看起来像工作,但结果有时会被重复(具有相同的 id)。
id
1
2
3
3
4
5
我认为过滤器可以保证返回唯一的ID,我错了吗?
或者是否可以省略重复的行?
class Obj(models.Model):
created_at = models.DateTimeField(null=True)
lns = models.ManyToManyField(Ln)
sts = models.ManyToManyField(St)
is = models.ManyToManyField(Is)
pub_date = models.DateTimeField('date published')
解决方案
不,如果您在一对多或多对多关系中进行过滤,它将与相关表创建一个 JOIN,如果多个对象匹配,那么这将导致多次产生相同的值。
您可以使用.distinct(..)
( Django-doc ) 过滤重复的行。
objs = objs.filter(
Q(lns__id__in=lnIds) |
(Q(sts__id__in=oIds) & (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))
).distinct()
更有问题的是,如果您添加注释,那么这可能导致计数也会计算重复项。您可以将distinct=True
[Django-doc]添加到Count(..)
表达式中以防止:
objs = objs.annotate(
num_line=Count('lns', distinct=True)
).filter(
Q(lns__id__in=lnIds) |
(Q(sts__id__in=oIds) & (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))
).distinct()
推荐阅读
- angular - TS“找不到名称”仅在 polyfills.ts 打开时消失
- javascript - 强制从外部 url 下载文件不在新选项卡/窗口中打开
- python - Python:描述符如何伪装对象的属性以及它是如何工作的?
- amazon-web-services - 如何为 cloudformation.createStack 提供参数?
- java - 如何在各种不同的项目中访问 Selenium Java Framework 的实用程序?
- python-3.x - 如何实现早期停止标准 - Tensorflow 对象检测 API
- uiscrollview - 在 ScrollView 中将文本对齐为前导 - SWIFTUI
- java - 不支持; 需要 @DynamoDBTyped 或 @DynamoDBTypeConverted
- google-chrome - puppeteer 的最大断点数?
- reactjs - 如何修复 React forwardRef(Menu) Material UI?