Django order_by()过滤器与distinct()

时间:2013-12-14 11:56:36

标签: django django-models django-aggregation django-filters

如何制作像这样的order_by ....

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

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

希望它有意义吗?

我收到了这个数据库错误:

  

SELECT DISTINCT ON表达式必须与初始ORDER BY表达式匹配   第1行:SELECT DISTINCT ON(“search_vendor”。“name”)   “search_product” ...

4 个答案:

答案 0 :(得分:39)

根据您的错误消息和this other question,在我看来,这会解决它:

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

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

答案 1 :(得分:8)

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

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

然而,当我改为:

时它起作用了
qs.order_by('project_id').distinct('project')

我甚至没有多个order_by args。

答案 2 :(得分:1)

我有类似的问题,但后来有相关的字段。只需在distinct()中添加相关字段,我就无法获得正确的结果。

我想按room__name排序person(链接到residency)唯一。根据以下修复我的问题重复相关字段:

.order_by('room__name', 'residency__person', ).distinct('room__name', 'residency__person')

另见这些相关帖子:

答案 3 :(得分:0)

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

from django.db.models import Subquery

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