Para mi aplicación Django tengo Eventos, Valoraciones y Usuarios. Las clasificaciones se relacionan con Eventos y Usuarios a través de claves externas. Al mostrar una lista de eventos, deseo filtrar las calificaciones del evento por un user_id para saber si un evento ha sido calificado por el usuario.Django: filtrado en objetos relacionados
Si hago:
event_list = Event.objects.filter(rating__user=request.user.id)
(request.user.id da user_id de la corriente usuario conectado) ... entonces solo me dan los eventos que están clasificados por el usuario y no a la totalidad lista de eventos.
Lo que necesito se pueden generar a través del SQL personalizado:
SELECT *
FROM `events_event`
LEFT OUTER JOIN (
SELECT *
FROM `events_rating`
WHERE user_id = ##
) AS temp
ON events_event.id = temp.user_id
¿Existe una manera más fácil, así que no tengo que usar SQL personalizada?
rating_set es el administrador que gestiona la relación con la calificación, por lo que siempre existirá. Incluso si le agregó una .count o .all, eso le daría detalles de todas las clasificaciones, no solo las del usuario actual. –
No es mi pregunta :-) e.rating_set sería un django.db.models.fields.related.RelatedManager, por lo que {% if e.rating_set%} siempre pasaría. Tratar de iterarlo le daría TypeError: el objeto 'RelatedManager' no es iterable.Tendría que usar e.rating_set.all para obtener su comportamiento deseado. –