从表字段中选择不同的值

我一直在努力理解姜戈的手机。我想要做的是在我的表中的一个字段中获得一个不同值的列表... ..。相当于下列其中之一:

SELECT DISTINCT myfieldname FROM mytable

(或其他选择)

SELECT myfieldname FROM mytable GROUP BY myfieldname

在使用原始 sql 之前,我至少想用姜戈的方式来做。 例如,对于一个表:

身份,街道,城市

赫尔大街1号

赫尔街2号

莱斯特,妙脆角路3号

4,另一种方式,莱斯特

高街5号 Londidium

我想得到:

赫尔,莱斯特,Londidium。

165092 次浏览

假设你的模型是“商店”

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属性集(它是 tuple 或列表) ,所以在使用 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()

这个函数返回一个 ValuesListQuerySet,您可以将它强制转换为 list。 您还可以将 flat=True添加到 values_list以平化结果。

参见: 按字段获取不同的 Queryset 值

除了仍然非常相关的 朱莉的答案之外,我发现了解 order_by()distinct("field_name")查询的影响也非常重要。然而,这是 Postgres 唯一的功能!

如果您正在使用 Postgres,并且您定义了一个字段名称,这个查询应该是不同的,那么 order_by()需要以相同的字段名称(或字段名称)以相同的顺序开始(之后可能会有更多的字段)。

注意

指定字段名时,必须在 以及 order _ by ()中的字段必须以 以同样的顺序。

例如,SELECTDISTINCTON (a)为每个 值。如果不指定顺序,则会得到一些 任意行。

如果你想提取一个你知道商店在哪里的城市列表,那么 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 []

如果您使用 不要,并且您只想获得和区分只有一个特定的字段,您可以使用

MyModel.objects.values('name').annotate(Count('id')).order_by()

这个查询集返回的行中,它们的“ name”字段与具有相同名称的行的数目是唯一的

<QuerySet [{'name': 'a', 'id__count': 2}, {'name': 'b', 'id__count': 2}, {'name': 'c', 'id__count': 3}>

我知道返回的数据不完整,有时不能令人满意,但有时它是有用的

文件参考文件

SELECTDISTINCT 语句仅用于返回不同的(不同的)值。在表中,一列通常包含许多重复的值; 使用 独特的()我们可以获得 Unique 数据。

Event = Event.objects.values (‘ item _ event _ type’) . different ()
Series alizer = ItemEventTypeSerializer (event,many = True)
返回响应(seralizer.data)