首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从表字段中选择不同的值

从表字段中选择不同的值
EN

Stack Overflow用户
提问于 2010-03-18 06:56:32
回答 4查看 135.8K关注 0票数 138

我正在努力理解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,莱斯特,隆迪亚。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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()

这个函数返回一个可以转换为listValuesListQuerySet。还可以将flat=True添加到values_list以展平结果。

另请参阅:Get distinct values of Queryset by field

票数 262
EN

Stack Overflow用户

发布于 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')  
票数 19
EN

Stack Overflow用户

发布于 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 []
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2466496

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档