https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct
q = FruitBasket.objects.distinct('fruit')
仅当您使用 postgres 时才有效。
仅在 PostgreSQL 上,您可以在
为了指定 DISTINCT 应该到的字段的名称
申请。这将转换为 SELECT DISTINCT ON SQL 查询。这是
区别。对于普通的 distinct() 调用,数据库比较每个
在确定哪些行不同时,每行中的字段。为一个
distinct() 调用指定的字段名称,数据库将只
比较指定的字段名称。
此外,您必须指定 order_by 并且不能按时间戳:
q = FruitBasket.objects.distinct('fruit').order_by('fruit')
当您指定字段名称时,您必须在
QuerySet,并且 order_by() 中的字段必须以中的字段开头
distinct(),顺序相同。
例如,SELECT DISTINCT ON (a) 为您提供每个
a列中的值。如果你不指定订单,你会得到一些
任意行。
但是,如果您可以取消要求,values 可能会让您更接近:distinct/order_by 以相同的顺序具有相同的值。
q = (
FruitBasket.objects
.values('id', 'fruit', 'count')
.distinct('fruit').order_by('-id')
)
实际上,有时候跳出 ORM 会更好
SELECT id, fruit, count
FROM FruitBasket
GROUP BY fruit
ORDER BY id DESC
所以这个查询并不神奇......
SELECT * FROM (SELECT id, fruit, count
FROM FruitBasket
ORDER BY id DESC) t
GROUP BY t.fruit
这个更好,但有点丑。
自行优化:
q = FruitBasket.objects.raw("""\
SELECT * FROM
(
SELECT id, fruit, count
FROM FruitBasket
ORDER BY id DESC
) t
GROUP BY t.fruit
""")