Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.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()过滤器,带distinct()_Django_Django Models_Django Aggregation_Django Filters - Fatal编程技术网

Django order_by()过滤器,带distinct()

Django order_by()过滤器,带distinct(),django,django-models,django-aggregation,django-filters,Django,Django Models,Django Aggregation,Django Filters,我怎样才能像这样下订单 p = Product.objects.filter(vendornumber='403516006')\ .order_by('-created').distinct('vendor__name') 问题是我有多个同名供应商,我只想要供应商提供的最新产品 希望它有意义 我得到了这个DB错误: 表达式上的SELECT DISTINCT必须按表达式匹配初始顺序 第1行:在“搜索供应商”“名称”上选择“不同” “搜索产品” 根据您的错误

我怎样才能像这样下订单

p = Product.objects.filter(vendornumber='403516006')\
                   .order_by('-created').distinct('vendor__name')
问题是我有多个同名供应商,我只想要供应商提供的最新产品

希望它有意义

我得到了这个DB错误:

表达式上的SELECT DISTINCT必须按表达式匹配初始顺序 第1行:在“搜索供应商”“名称”上选择“不同” “搜索产品”


根据您的错误消息,在我看来,这将修复它:

p = Product.objects.filter(vendornumber='403516006')\
               .order_by('vendor__name', '-created').distinct('vendor__name')

也就是说,表达式上的
DISTINCT必须与最左边的
ORDER BY
表达式匹配。因此,通过将您在
中使用的列设置为distinct
作为
order\u by
中的第一列,我认为它应该可以工作。

仅匹配最左边的order\u by()arg和distinct()对我不起作用,产生了相同的错误(Django 1.8.7 bug或特性)

但是,当我改为:

qs.order_by('project__id').distinct('project')

我甚至没有ARG的多个订单。

我也有类似的问题,但与相关字段有关。只在
distinct()
中添加了相关字段,没有得到正确的结果

我想按
房间名
排序,保持
(链接到
居住
)的唯一性。根据以下内容重复相关字段修复了我的问题:

.order_by('room__name', 'residency__person', ).distinct('room__name', 'residency__person')
另见这些相关员额:


如果您希望使用一个单独的字段来区分和排序另一个字段,您可以使用下面的代码

from django.db.models import Subquery

Model.objects.filter(
    pk__in=Subquery(
       Model.objects.all().distinct('foo').values('pk')
    )
).order_by('bar')

但使用此方法,它将首先按供应商名称订购,并仅使用“created”作为二次订购。这意味着“创建”的订单将不正确@你说的是真的。但不一定相关。OP似乎对通过
创建的
进行订购不感兴趣。他使用
created
不是为了对最终结果进行排序,而是为了获得每个供应商的正确记录。在OP的用例中,供应商的订购似乎并不重要。事实上,我们不知道真正的预定订购,OP基本上没有指定。谢谢,真的不是一件显而易见的事情。如果我想按其他方式订购,但在另一列中有不同的值,该怎么办?谢谢!这是我运行Django 2.0.2和PostgreSQL 10.1唯一有效的方法。我尝试了其他建议,包括匹配
order\u by
distinct
的参数顺序,但这些都没有解决问题。同样的问题,不确定为什么需要_id。我也成功地将u id添加到order\u by()中,但没有添加distinct()@dowjones123原因可能是相关模型(本答案中的项目)上定义的默认顺序。“distinct()”说明中最后一个注释中的文档。据我所知,这与预回迁相关的文档不正常工作……其他答案对我不起作用,因为我需要在以后从同一查询集中对其他字段执行排序。这个成功了。
from django.db.models import Subquery

Model.objects.filter(
    pk__in=Subquery(
       Model.objects.all().distinct('foo').values('pk')
    )
).order_by('bar')