order_by创建重复的条目

时间:2017-04-02 22:19:57

标签: django django-views django-queryset

我有4个模型类:用户,堆栈,文章和评级。用户可以创建堆栈,添加文章,将它们放在堆栈上,对文章进行评级并共享堆栈。 我想得到一个特定堆栈的所有文章的QuerySet(由pk获取)并按当前用户评级排序。如果共享堆栈并且文章被其他用户评级,我的查询会导致我的QuerySet中出现重复条目​​,因此文章存在两次评级对象:

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)

如何获得没有重复项的有序QuerySet,只是按request.user评级排序。

更新

我现在要做的是查询两次。一次获得已评级的文章对象按评级排序,第二次获取当前未评级的文章对象未分类。

    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
    )

1 个答案:

答案 0 :(得分:1)

根据堆栈所有者

,您应该能够在订购之前过滤文章集
user = stack.owner
stack.article_set.filter(rating__user__exact=user).order_by("ratings__rating", "-pk")