从表中字段中选择不同的值
-
20-09-2019 - |
题
我挣扎让我周围的Django的ORM头。我想做的事就是我的表中的字段中获得不同值的列表....下面的一个等价的:
SELECT DISTINCT myfieldname FROM mytable
(或备选地)
SELECT myfieldname FROM mytable GROUP BY myfieldname
我至少喜欢诉诸原始SQL之前做Django的方式。 例如,与表:
ID,街道,城市
1,主街,赫尔
2,其他街道,赫尔
3,比博路,莱斯特
4,另一种方法,莱斯特
5,高街,Londidium
我想获得:
赫尔,莱斯特,Londidium。
解决方案
假设你的模式是 '店'
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()
它返回一个dictionnary
或
models.Shop.objects.order_by().values_list('city').distinct()
这一个返回ValuesListQuerySet
它可以转换为list
。
您还可以添加flat=True
到values_list
扁平化的结果。
参见:找字段查询集的不同值
其他提示
除了jujule 的还是很有关答案,我觉得很重要,也知道了含义对order_by()
查询distinct("field_name")
。的是这样的,但是,一个Postgres只设有!强>
如果您使用的Postgres,如果你定义一个字段名的查询应该是不同的对,然后order_by()
需要开始具有相同字段名(或字段名)以相同的序列(有可能是多个字段之后)
请注意
当指定字段名,则必须提供在一个ORDER_BY() 查询集,并在ORDER_BY()的字段必须与领域开始 不同(),以相同的顺序。
例如,SELECT DISTINCT ON(a)是为每个所述第一行 在列中的值。如果没有指定命令,你会得到一些 任意行。
如果要通过电子邮件-G-提取你知道在商店的城市列表,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 []