2017-03-15 7 views
1

私はモデルVisitを持っています。これはForeignKeyがモデルStoreにあります。私はVisitのフィルタリングされたクエリセットを持っています、そして、Visitの指定されたクエリセットのの少なくとも2回、が少なくとも2回発生する回数を取得する必要があります。私はそうと、ループでこれを達成することができます知っている:関連するクエリセット内の外部キーの出現数をカウントする

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を使用するか、visit_querysetに基づいてStoreクエリーセットを作成しましたが、まだループなしで動作するソリューションは見つかりませんでした。 visit_set__in=visitsによって

+0

をカウントするあなたを持っていますhttps://docs.djangoproject.com/en/dev/topics/db/aggregation/をお読みください。 – lufte

+0

うん、私はそこに少なくとも2回出現するものだけを得ることができる何かを見つけていない。それが私が始めたところです。 –

答えて

2

次のクエリは、(ストアのForeignKeyへの訪問のためrelated_nameに応じて、または類似したもの)動作するはず

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

フィルタリングだけに、「フィルタ」の注釈をそれらの訪問

+0

これを削除し、related_nameを更新して設定した内容と一致させて、完全に機能しました。ありがとう! –

関連する問題