Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在筛选的查询集中获取重复记录_Python_Django_Django Queryset - Fatal编程技术网

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()