Per la mia app Django ho eventi, valutazioni e utenti. Le classificazioni sono correlate agli eventi e agli utenti tramite chiavi esterne. Quando si visualizza un elenco di eventi, desidero filtrare le classificazioni dell'evento da un id_utente in modo da sapere se un evento è stato valutato dall'utente.Django - filtraggio su oggetti correlati
Se lo faccio:
event_list = Event.objects.filter(rating__user=request.user.id)
(request.user.id dà l'user_id della corrente utente connesso) ... poi ho solo gli eventi che sono valutati dall'utente e non l'intera lista di eventi.
Che cosa ho bisogno può essere generata attraverso l'SQL personalizzato:
SELECT *
FROM `events_event`
LEFT OUTER JOIN (
SELECT *
FROM `events_rating`
WHERE user_id = ##
) AS temp
ON events_event.id = temp.user_id
c'è un modo più semplice, quindi non c'è bisogno di utilizzare SQL personalizzato?
rating_set è il gestore che gestisce la relazione alla valutazione, quindi esisterà sempre. Anche se hai aggiunto un .count o .all ad esso, ciò ti darebbe i dettagli per tutte le valutazioni, non solo quelle per l'utente corrente. –
Non è una mia domanda :-) e.rating_set sarebbe un django.db.models.fields.related.RelatedManager, quindi {% se e.rating_set%} passerebbe sempre. Cercando di eseguire l'iterazione si otterrebbe TypeError: l'oggetto 'RelatedManager' non è iterabile.Dovresti usare e.rating_set.all per ottenere il tuo comportamento previsto. –