の対象は、単純化された私のモデルのバージョンでカウント彼が所有するFlight
オブジェクトのフィールドには、Flight
というオブジェクトの対応する番号が付いています。はここで条件
たとえば、ユーザーが3便でご利用されているとします。LAX-LHR
、LHR-CDG
、およびCDG-JFK
です。その後、私は次のオブジェクトを返すクエリたいと思います:上記で
[LHR, id__count=2}, {CDG, id__count=2}, {LAX, id__count=1}, {JFK, id__count=1}]
を、3つの文字コードはAirport
オブジェクトまたはすべてのフィールドに立っています。
一般的に、User
sおよび十Airport
sおよびFlight
秒の何千もの何千ものがあるかもしれないので、私は、好ましくは、単一のデータベースクエリで、forループやif文との明白な解決策よりも効率的なものを求めています。初期filter
が唯一の彼のフライトでどこかに表示され、それらの空港を保つため
Airport.objects.filter(
Q(origins__owner=user) | Q(destinations__owner=user)
)
.distinct()
.annotate(
id__count=Count('origins', distinct=True) + Count('destinations', distinct=True)
).order_by('-id__count')
これは、1人のユーザーにのみ完璧に動作します:
私の現在の進行状況は、このクエリです。しかし、カウントにはすべてのユーザーのフライトが含まれているため、複数のユーザーがいる場合は明らかに失敗します。 owner=user
ここで、これらのFlight
オブジェクトは、owner=user
です。user
は、特定のUser
オブジェクトです。
編集:this page in the Djnago documentationを読んだ後、必要に応じて第一のフィルタを置くことは、この仕事をしなければならないようです。しかし、少なくとも私はQオブジェクトを使用していません。私は次の非常に混乱した結果を発見しました。
私はこのクエリを使用する場合、すなわち唯一の起源を見て、それが動作し、num_origins
フィールドが指定されたuser
に属するものだけ便をカウント:
Airport.objects.filter(origins__owner=user).annotate(num_origins=Count('origins'))
(これはまさに私ではありませんカウントのみ原点特定Airport
ですが、それは正しくUser
Sをフィルタリングしない航空券を含むので
)。必要しかし、私は何もしないときにはと組み合わせるか、2つのQオブジェクトを単一のフィルタを交換する、すなわち
Airport.objects.filter(Q(origins__owner=user) | Q(destinations__owner=user)).annotate(num_origins=Count('origins'))
現在、すべてのユーザーに属するフライトをカウントします。注釈は、Qオブジェクトを使用するときにフィルタについて「忘れる」ようです。ここで何が起こっているのですか?
あなたはフライトオブジェクトの所有者キーの関連名を追加していないのはなぜ?その後、すべてのユーザーのフライトを取得し、別々のフライトカウントのみが表示されるように個別に適用することができます。 –
@ÇağatayBarınオーナーフィールドに関連する名前を追加しましたが、それを使用する方法はまだわかりません。もう少し説明できますか?ありがとう。 – jc315