Für meine Django App habe ich Ereignisse, Bewertungen und Benutzer. Bewertungen beziehen sich auf Ereignisse und Benutzer über Fremdschlüssel. Beim Anzeigen einer Liste von Ereignissen möchte ich die Bewertungen des Ereignisses durch eine user_id filtern, damit ich weiß, ob ein Ereignis vom Benutzer bewertet wurde.Django - Filtern nach verwandten Objekten
Wenn ich tun:
event_list = Event.objects.filter(rating__user=request.user.id)
(request.user.id gibt die user_id des aktuellen angemeldeten Benutzers) ... dann habe ich nur die Ereignisse erhalten, die durch den Benutzer und nicht den gesamten bewertet werden Liste der Ereignisse.
Was ich brauche, kann durch die benutzerdefinierte SQL erzeugt werden:
SELECT *
FROM `events_event`
LEFT OUTER JOIN (
SELECT *
FROM `events_rating`
WHERE user_id = ##
) AS temp
ON events_event.id = temp.user_id
Gibt es einen einfacheren Weg, so muss ich nicht benutzerdefinierte SQL verwenden?
rating_set ist der Manager, der die Beziehung zur Bewertung verwaltet, also wird es immer existieren. Selbst wenn Sie eine .count- oder .all-Datei hinzugefügt hätten, würden Sie dadurch Details zu allen Bewertungen erhalten, nicht nur zu denen für den aktuellen Benutzer. –
Es ist nicht meine Frage :-) e.rating_set wäre ein django.db.models.fields.related.RelatedManager, also würde {% if e.rating_set%} immer passieren. Wenn Sie versuchen, es zu iterieren, erhalten Sie TypeError: Das Objekt 'RelatedManager' ist nicht iterierbar.Sie müssten e.rating_set.all verwenden, um Ihr beabsichtigtes Verhalten zu erhalten. –