我正在努力理解Django的ORM。我想要做的是在我的表中获取字段中不同值的列表……等同于以下其中一项:
SELECT DISTINCT myfieldname FROM mytable
(或者也可以选择)
SELECT myfieldname FROM mytable GROUP BY myfieldname
在求助于原始sql之前,我至少希望采用Django的方式。例如,对于一个表:
id,街道,城市
赫尔主街1号
2,其他街道,赫尔
3,Bibble Way,莱斯特
4,另一种方式,莱斯特
伦敦商业街5号
我想要得到:
Hull,莱斯特,隆迪亚。
发布于 2010-03-18 17:23:20
假设你的模型是'Shop‘
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
类的ordering
属性(它是元组或列表),因此在使用distinct()
时,可以使用不带参数的order_by()
来清除任何排序。请参阅order_by
()下的文档
如果您不希望对查询应用任何排序,甚至不希望使用默认排序,那么可以不带参数地调用order_by()。
和笔记中的distinct()
,其中讨论了在排序中使用distinct()
的问题。
要查询数据库,您只需调用:
models.Shop.objects.order_by().values('city').distinct()
它返回一个字典
或
models.Shop.objects.order_by().values_list('city').distinct()
这个函数返回一个可以转换为list
的ValuesListQuerySet
。还可以将flat=True
添加到values_list
以展平结果。
发布于 2018-05-24 15:31:11
除了仍然非常相关的answer of jujule之外,我发现了解order_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')
发布于 2018-08-06 09:33:57
举个例子:
# 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 []
https://stackoverflow.com/questions/2466496
复制相似问题