我有一个模型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
查询集,但尚未找到无循环的解决方案。
答案 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
过滤将"过滤"注释只计算这些访问次数