Ich versuche, Zeilen aus einer Tabelle zu erhalten, deren Einträge die meisten Übereinstimmungen in einer anderen Tabelle aufweisen, auf die mit einem Feld manytomany verwiesen wird.Django-Filtertabelle und sortieren nach Anzahl
Die SQL, das funktioniert ist:
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
Das Ereignismodell hat:
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")
Aus meiner Sicht habe ich versucht:
results = Event.objects.filter(
Q(genres__id__in=genres),
Q(start_date__gte=datetime.date.today()) \
.annotate(event=Count('id')) \
.order_by('event')
Die Ergebnisse erhalte ich fast das gleiche wie diese SQL-Abfrage:
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
So eindeutig funktioniert die Zählung nicht.
Was ist der Django-Weg, dies zu tun?
Können Sie eine einfache englische Version von dem, was gewünschte Ergebnis? Der Versuch, Ihr SQL zurückzuentwickeln, ist nicht einfach. – solarissmoke
Sicher. Ich versuche, alle Ereignisse zu erhalten, die mit einer Liste von Genres übereinstimmen, und zähle dann, wie viele Übereinstimmungen jedes Ereignis hat. Ich möchte alle Ereignisse zurückgeben, die zu mindestens einem der Genres passen, aber nach der Anzahl der Übereinstimmungen sortiert sind, die jedes Ereignis hat. – James