Answers:
假设您的模特是“商店”
class Shop(models.Model):
street = models.CharField(max_length=150)
city = models.CharField(max_length=150)
# some of your models may have explicit ordering
class Meta:
ordering = ('city')
由于您可能设置了Meta
class ordering
属性,因此在使用时,可以order_by()
不使用任何参数来清除任何顺序distinct()
。请参阅()下的文档order_by
如果您不希望对查询应用任何排序,甚至不希望使用默认排序,请调用不带参数的order_by()。
并distinct()
在注释中讨论了distinct()
与订购一起使用的问题。
要查询数据库,您只需调用:
models.Shop.objects.order_by().values('city').distinct()
它返回字典
要么
models.Shop.objects.order_by().values_list('city').distinct()
这将返回ValuesListQuerySet
,您可以将其转换为list
。您还可以添加flat=True
到values_list
扁平化的结果。
另请参阅:通过字段获取Queryset的不同值
values_list
它实际上不会返回列表。它返回类似查询集的内容。我发现在values_list调用周围始终使用list()很有用。
values_list
返回ValuesListQuerySet,它是一个迭代器。强制转换为列表可能很方便,但是当必须一次评估所有行时(特别是对于大型数据集),也会影响性能。
Meta: ordering = ()
django orm和objects.distinct()
vs. 的“功能” objects.ordering().distinct()
使我们困惑了数小时。该产品上应该贴有消费者安全警告标贴;)我们可能会制定无元订购属性政策,以防止将来出现头疼的情况。
Meta
类ordering
并解决问题。它位于QuerySet API文档中的“ 如果您不希望对查询应用任何排序,甚至不希望使用默认排序,请不使用任何参数进行调用。 ”distinct
order_by()
order_by()
order_by()
除了jujule仍然非常相关的答案外,我发现还很重要的一点是,也要意识到jujuleorder_by()
对distinct("field_name")
查询的影响。但是,这是仅Postgres的功能!
如果您使用的是Postgres,并且定义了查询所要区分的字段名,则order_by()
需要以相同的序列名(或多个字段名)以相同的顺序开头(之后可能会有更多的字段)。
注意
指定字段名称时,必须在QuerySet中提供order_by(),并且order_by()中的字段必须以相同的顺序从distinct()中的字段开始。
例如,SELECT DISTINCT ON(a)为列a中的每个值提供第一行。如果您不指定订单,则会得到一些任意行。
如果您想提取例如您知道在其有商店的城市的列表,则必须将jujule的示例进行以下调整:
# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')
例如:
# select distinct code from Platform where id in ( select platform__id from Build where product=p)
pl_ids = Build.objects.values('platform__id').filter(product=p)
platforms = Platform.objects.values_list('code', flat=True).filter(id__in=pl_ids).distinct('code')
platforms = list(platforms) if platforms else []