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')