58

我怎样才能做出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

4 回答 4

75

根据您的错误消息和其他问题,在我看来这可以解决它:

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

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

于 2013-12-14T12:22:59.953 回答
24

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

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

但是当我改为:

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

而且我什至没有多个 order_by 参数。

于 2015-11-25T14:48:00.950 回答
20

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

from django.db.models import Subquery

Model.objects.filter(
    pk__in=Subquery(
       Model.objects.all().distinct('foo').values('pk')
    )
).order_by('bar')
于 2019-05-27T23:50:24.440 回答
3

我有一个类似的问题,但随后是相关领域。仅在 中添加相关字段distinct(),我没有得到正确的结果。

我想通过room__name保持person(链接到residency)唯一来进行排序。按照以下重复相关字段修复了我的问题:

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

另请参阅这些相关帖子:

于 2016-01-08T09:44:14.727 回答