Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django order_by创建重复条目_Django_Django Views_Django Queryset - Fatal编程技术网

Django order_by创建重复条目

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") 模型: 我如何才能

我有4个模型类:User、Stack、Article和Rating。用户可以创建堆栈、添加文章、将它们放在堆栈上、对文章进行评分并共享堆栈。 我想获得一个特定堆栈(通过pk获得)的所有文章的查询集,并按当前用户评级排序。如果堆栈被共享,并且一篇文章被另一个用户评级,那么我的查询将导致我的QuerySet中出现重复条目,因此一篇文章存在两个评级对象:

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。此数据库后端不支持此return
DISTINCT ON字段,因为我使用的是MySQL,而不是PostgreSQL。但我认为这样就不会总是区分正确的对象。它只检查重复的
文章id
,不检查评级对象是否来自
请求.user
。这样它可以正确过滤,但一个限制是,即使请求.user当前未对所有文章进行评级,我也需要获取它们。现在,我通过排除已评级的对象来执行另一个查询。
user = stack.owner
stack.article_set.filter(rating__user__exact=user).order_by("ratings__rating", "-pk")