Python 在筛选的查询集中获取重复记录
我有一个有点复杂的Python 在筛选的查询集中获取重复记录,python,django,django-queryset,Python,Django,Django Queryset,我有一个有点复杂的|&过滤器组合,如下所示 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,但我错了吗 或者是否可以省略重复的行 class O
|&
过滤器组合,如下所示
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,但我错了吗
或者是否可以省略重复的行
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')
否,如果过滤一对多或多对多关系,它将创建与相关表的联接,如果多个对象匹配,则这将导致多次生成相同的值 您可以使用
.distinct(..)
()来过滤重复的行
objs = objs.filter(
Q(lns__id__in=lnIds) |
(Q(sts__id__in=oIds) & (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))
).distinct()
使用
num\u line
,您的具体目标是什么?匹配行的数量(根据过滤器),还是总行数?我理解。使用distinct()。问题解决了。DjangoQ是非常有用和强大的。
objs = objs.filter(
Q(lns__id__in=lnIds) |
(Q(sts__id__in=oIds) & (Q(lns__id__in=lnIds) | Q(num_ln__lte=0))
).distinct()
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()