计算相关查询集中

时间:2017-03-15 17:49:47

标签: python django django-queryset

我有一个模型Visit,它有一个到模型Store的ForeignKey。我有一个Visit s的过滤查询集,我需要计算在Store的给定查询集中有多少Visit出现至少两次的计数秒。我知道我可以通过循环实现这一点,因为:

store_at_least_twice = {}
for visit in visit_queryset:
    # Set the value as False if this is the first time we've seen this store
    # True if we've seen it already
    store_at_least_twice[visit.store] = visit.store in store_at_least_twice.keys()
# Return count of True values
return sum(store_at_least_twice.values())

这给了我需要的结果,但似乎应该有一种方法来做到这一点,而没有迭代遍历可能是一个长查询集的每个项目的开销。我已经考虑使用annotate或基于Store创建visit_queryset查询集,但尚未找到无循环的解决方案。

1 个答案:

答案 0 :(得分:2)

以下查询应该有效(或类似的东西,具体取决于访问存储ForeignKey的related_name)

Store.objects.filter(
    visit_set__in=visit_queryset
).annotate(
    num_visits=Count('visit_set')
).filter(
    num_visits__gte=2
).count()

visit_set__in=visits过滤将"过滤"注释只计算这些访问次数