从表字段中选择不同的值

时间:2010-03-17 22:56:32

标签: django django-queryset django-orm query-performance

我正在努力绕过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。

3 个答案:

答案 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')

由于您可能设置了Metaordering属性,因此在使用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以展平结果。

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

答案 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 []