Django order_by创建重复条目
我有4个模型类:User、Stack、Article和Rating。用户可以创建堆栈、添加文章、将它们放在堆栈上、对文章进行评分并共享堆栈。 我想获得一个特定堆栈(通过pk获得)的所有文章的查询集,并按当前用户评级排序。如果堆栈被共享,并且一篇文章被另一个用户评级,那么我的查询将导致我的QuerySet中出现重复条目,因此一篇文章存在两个评级对象:Django order_by创建重复条目,django,django-views,django-queryset,Django,Django Views,Django Queryset,我有4个模型类:User、Stack、Article和Rating。用户可以创建堆栈、添加文章、将它们放在堆栈上、对文章进行评分并共享堆栈。 我想获得一个特定堆栈(通过pk获得)的所有文章的查询集,并按当前用户评级排序。如果堆栈被共享,并且一篇文章被另一个用户评级,那么我的查询将导致我的QuerySet中出现重复条目,因此一篇文章存在两个评级对象: qs = stack.article_set.all().order_by("ratings__rating", "-pk") 模型: 我如何才能
qs = stack.article_set.all().order_by("ratings__rating", "-pk")
模型:
我如何才能获得没有重复项的已排序查询集,仅按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
)
您应该能够在订购之前根据堆栈所有者筛选文章集
user = stack.owner
stack.article_set.filter(rating__user__exact=user).order_by("ratings__rating", "-pk")
没有,但我现在尝试了,并调用了
stack.article\u set.all().order\u by(“ratings\u rating”,“-pk”).distict()
只剪切由另一个具有相同评级的用户评级的文章。如果其他用户的评级与当前用户不同,则不会区分对象。我明白你的意思。我认为,在尝试按评级排序时,您的查询集中可能总是有重复项,因为一篇文章可能有多个评级。也许只需返回文章queryset un ordered,然后编写一些代码以手动按评级排序?但是,当一篇文章有多个级别时,您会遇到选择使用哪个级别的问题。请尝试将“article_id”作为参数传递给DISTINCT。此数据库后端不支持此returnDISTINCT ON字段,因为我使用的是MySQL,而不是PostgreSQL。但我认为这样就不会总是区分正确的对象。它只检查重复的文章id
,不检查评级对象是否来自请求.user
。这样它可以正确过滤,但一个限制是,即使请求.user当前未对所有文章进行评级,我也需要获取它们。现在,我通过排除已评级的对象来执行另一个查询。
user = stack.owner
stack.article_set.filter(rating__user__exact=user).order_by("ratings__rating", "-pk")