【问题标题】:How do I select distinct values in Django?如何在 Django 中选择不同的值?
【发布时间】:2012-03-20 02:37:18
【问题描述】:

这是我的代码:

[app.system_name for app in App.objects.all().distinct('system_name')]

给我:

[u'blog', u'files', u'calendar', u'tasks', u'statuses', u'wiki', u'wiki', u'blog
', u'files', u'blog', u'ideas', u'calendar', u'wiki', u'wiki', u'statuses', u'ta
sks', u'survey', u'blog']

如您所料,我想要字段 system_name 的所有唯一值,但现在我只取回所有 App 实例。

【问题讨论】:

  • 您始终可以将值放入set 以删除重复项事后

标签: python django python-2.6


【解决方案1】:
  1. 仅在 Django 1.4+ 中支持在 distinct 中指定字段。如果你运行的是 1.3,它只是忽略它。

  2. 如果您正在运行 Django 1.4,则必须添加一个 order_by 子句,该子句包括并以 distinct 中的所有字段开头。

  3. 即便如此,使用distinct 指定字段也仅在 PostgreSQL 上支持。如果您正在运行其他东西,例如 MySQL,那么您就不走运了。

所有这些信息都在docs

【讨论】:

  • 嗯,我想我运气不好,因为我们使用的是 1.3。
  • 就这样做而言,是的,您似乎不走运。但是,这是一个典型的例子,询问为什么某种方法不起作用,而不是简单地询问如何做你想要的实际事情。您应该创建一个关于如何在查询集中删除重复值的新问题,或者简单地搜索这样的问题。我知道我以前见过类似的。
【解决方案2】:

distinct 与字段名称一起使用时,您必须 order by 相同的字段名称:

App.objects.order_by('system_name').distinct('system_name')

来自doc

当您指定字段名称时,您必须在 QuerySet,并且 order_by() 中的字段必须以中的字段开头 distinct(),顺序相同。

例如,SELECT DISTINCT ON (a) 为您提供每个 a列中的值。如果你不指定订单,你会得到一些 任意行。

【讨论】:

  • mysql 不支持使用 distinct() 带参数。
【解决方案3】:

在使用 distinct() 时可以使用 values_list()。

App.objects.values_list('system_name').distinct()

【讨论】:

    猜你喜欢
    • 2013-08-05
    • 2011-04-11
    • 2022-01-26
    • 2021-01-13
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 2021-08-12
    • 2018-04-12
    相关资源
    最近更新 更多