Tengo 4 clases de modelos: Usuario, Pila, Artículo y Calificación. Los usuarios pueden crear pilas, agregar artículos, ponerlos en una pila, calificar los artículos y compartir las pilas. Quiero obtener un QuerySet de todos los artículos de una pila específica (obtenidos por pk) y ordenados por la calificación actual de los usuarios. Mi consulta conduce a entradas duplicadas en mi QuerySet si la pila se compartió y otro usuario calificó un artículo, por lo que existe un objeto de calificación para un artículo dos veces:
qs = stack.article_set.all().order_by("ratings__rating", "-pk") class Rating(models.Model): article = models.ForeignKey( Article, on_delete=models.CASCADE, related_name='ratings' ) user = models.ForeignKey( settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name='ratings' ) rating = models.IntegerField() class Stack(models.Model): title = models.CharField(null=True, max_length=100) owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE) class Article(models.Model): stack = models.ForeignKey(Stack, null=True, blank=True, on_delete=models.CASCADE) text = models.TextField(null=True, blank=True)¿Cómo puedo obtener el QuerySet ordenado sin los duplicados, solo ordenado por las calificaciones de request.user?
Lo que hago por ahora es consultar dos veces. Una vez para ordenar los objetos de artículo ya calificados por calificación y una segunda vez para ordenar los objetos de artículo actualmente no calificados.
context['rated_articles'] = deck.article_set.filter( ratings__user__exact=self.request.user ).order_by("ratings__rating", "-pk") context['not_rated_articles'] = deck.article_set.all().exclude( ratings__user__exact=self.request.user )Debería poder filtrar el conjunto de artículos antes de ordenarlo, según el propietario de las pilas
user = stack.owner stack.article_set.filter(rating__user__exact=user).order_by("ratings__rating", "-pk")