Django order_by()过滤器使用distinct()

pkd*_*dkk 38 django django-models django-aggregation django-filters

我怎么能这样做order_by......

p = Product.objects.filter(vendornumber='403516006')\
                   .order_by('-created').distinct('vendor__name')
Run Code Online (Sandbox Code Playgroud)

问题是我有多个同名的供应商,我只想要供应商的最新产品.

希望有道理吗?

我收到了这个DB错误:

SELECT DISTINCT ON表达式必须匹配初始ORDER BY表达式LINE 1:SELECT DISTINCT ON("search_vendor"."name")"search_product"...

Sto*_*ica 47

根据您的错误消息和另一个问题,在我看来这将解决它:

p = Product.objects.filter(vendornumber='403516006')\
               .order_by('vendor__name', '-created').distinct('vendor__name')
Run Code Online (Sandbox Code Playgroud)

也就是说,似乎DISTINCT ON表达式必须与最左边的ORDER BY表达式匹配.因此,通过将您使用的列distinct作为第一列order_by,我认为它应该可行.

  • 但是使用这种方法,它将首先按供应商名称排序,并仅使用"created"作为辅助排序.这意味着"创建"的订单将不正确.https://docs.djangoproject.com/en/1.10/ref/models/querysets/#order-by (9认同)
  • 如果我想按其他顺序订购,但在另一栏中有不同的值怎么办? (3认同)

kop*_*die 17

如果您希望将单独的字段用于不同的字段并按另一个字段排序,您可以使用以下代码

from django.db.models import Subquery

Model.objects.filter(
    pk__in=Subquery(
       Model.objects.all().distinct('foo').values('pk')
    )
).order_by('bar')
Run Code Online (Sandbox Code Playgroud)

  • 其他答案对我不起作用,因为我需要稍后从同一查询集对其他字段执行排序。这个有效。 (2认同)

Dmi*_*sov 10

只匹配最左边的order_by()arg和distinct()对我来说不起作用,产生相同的错误(Django 1.8.7 bug或一个功能)?

qs.order_by('project').distinct('project')
Run Code Online (Sandbox Code Playgroud)

但当我改为:

qs.order_by('project_id').distinct('project')
Run Code Online (Sandbox Code Playgroud)

我甚至没有多个order_by args.

  • @dowjones123原因可能是相关模型(本答案中的项目)上定义的默认顺序。文档[提到了这种情况](https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct)在“distinct()”描述的最后一个注释中。 (4认同)