我正在努力绕过Django的ORM。我想要做的是在我的桌子上的字段中获取不同值的列表....相当于以下之一:
SELECT DISTINCT myfieldname FROM mytable
(或者)
SELECT myfieldname FROM mytable GROUP BY myfieldname
在使用原始sql之前,我至少喜欢用Django方式。 例如,使用表格:
id,street,city
1,主街,赫尔
2,其他街,赫尔
3,Bibble Way,莱斯特
4,另一种方式,莱斯特
5,High Street,Londidium
我想得到:
赫尔,莱斯特,Londidium。
答案 0 :(得分:166)
说你的模特是'购物'
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
属性,因此在使用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
以展平结果。
答案 1 :(得分:2)
除了仍然非常相关的answer of jujule之外,我发现了解order_by()
对distinct("field_name")
查询的影响非常重要。 然而,这只是Postgres的一项功能!
如果您正在使用Postgres,并且如果您定义了查询应该与之不同的字段名称,那么order_by()
需要以相同的顺序开始使用相同的字段名称(或字段名称)(可能存在之后的更多领域。)
请注意
指定字段名称时,必须在中提供order_by() QuerySet和order_by()中的字段必须以字段开头 distinct(),顺序相同。
例如,SELECT DISTINCT ON(a)为每个提供第一行 列a中的值。如果您没有指定订单,您将获得一些订单 任意行。
如果你想要e-g-提取你知道商店的城市列表,那么枣树的例子就必须适应这个:
# returns an iterable Queryset of cities.
models.Shop.objects.order_by('city').values_list('city', flat=True).distinct('city')
答案 2 :(得分:2)
例如:
# 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 []