2016-08-06 13 views
0

私は、エントリがmanytomanyフィールドで参照される別のテーブルで最も一致するテーブルから行を取得しようとしています。Djangoフィルタテーブルとカウント別にソート

働くSQLは次のようになります。私の見解で

class Event(models.Model): 
    title = models.CharField(max_length=250) 
    start_date = models.DateTimeField() 
    genres = models.ManyToManyField("genres.Genre", blank=True, null=True, related_name="events") 

は、私が試してみました::

SELECT *, COUNT(*) FROM events_event_genres 
LEFT JOIN events_event 
ON event_id = events_event.id 
WHERE genre_id IN (6,9,31) 
AND start_date > '2016-08-06' 
GROUP BY event_id 
ORDER BY COUNT(*) DESC 
LIMIT 10 

イベントモデルを持っている私が取得しています

results = Event.objects.filter(
    Q(genres__id__in=genres), 
    Q(start_date__gte=datetime.date.today()) \ 
    .annotate(event=Count('id')) \ 
    .order_by('event') 

結果がほとんどですこのSQLクエリと同じ:

SELECT * FROM events_event 
LEFT JOIN events_event_genres 
ON events_event.id = event_id 
WHERE genre_id IN (6,9,31) 
AND start_date > '2016-08-06' 
LIMIT 10 

明らかにカウントが機能していません。

これを行うためのジャンゴの方法は何ですか?

+0

あなたが望む結果何の平易な英語の説明を提供することができますか?あなたのSQLをリバースエンジニアリングしようとするのは簡単ではありません。 – solarissmoke

+0

私は、ジャンルのリストと一致するすべてのイベントを取得しようとしているし、それぞれのイベントがどれくらいの一致があるかを数えます。私はジャンルの少なくとも1つにマッチするが、各イベントが持つマッチの量で順序付けられたすべてのイベントを返したい。 – James

答えて

1

あなたは遠く離れていません。このクエリは動作するはずです:

Event.objects.filter(genres__in=genres, start_date__gte=datetime.date.today())\ 
.distinct().annotate(num_genres=Count('genres')).order_by('-num_genres') 

結果としてクエリセット内の各Eventオブジェクトが一致したジャンルの数のカウントでnum_genres性質を持つことになります。彼らは一致するジャンルの数で注文されます。

結果のSQLは次のとおりです。

SELECT DISTINCT "events_event"."id", "events_event"."name", 
COUNT("events_event_genres"."genre_id") AS "n" 
FROM "events_event" INNER JOIN "events_event_genres" 
ON ("events_event"."id" = "events_event_genres"."event_id") 
WHERE "events_event_genres"."genre_id" IN (g1) 
GROUP BY "events_event"."id", "events_event"."name" 
ORDER BY "n" DESC 
+0

ありがとう、それはうまくいっている! – James

関連する問題