我有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
)
答案 0 :(得分:1)
根据堆栈所有者
,您应该能够在订购之前过滤文章集user = stack.owner
stack.article_set.filter(rating__user__exact=user).order_by("ratings__rating", "-pk")