Django Model - 获取不同的值列表

Posted

技术标签:

【中文标题】Django Model - 获取不同的值列表【英文标题】:Django Model - Get distinct value list 【发布时间】:2012-06-06 14:35:34 【问题描述】:

我尝试获取不同外键的列表,然后我写了这个:

my_ids = Entity.objects.values('foreign_key').distinct()

但我只得到一个 UNDISTINCT 外键列表...我错过了什么?

谢谢!

【问题讨论】:

【参考方案1】:

将参数传递给 distinct 不适用于 mysql 数据库 (AFAIK)

这个工作并且只返回一个对象:

Entity.objects.order_by('foreign_key').values('foreign_key').distinct()

【讨论】:

我在 Postgres9.1 数据库 Django==1.5.5 上有同样的问题。添加 order_by 帮助 - 愚蠢...【参考方案2】:

也许你可能想这样做:

Entity.objects.order_by().values_list('foreign_key', flat=True).distinct()

【讨论】:

错误。在没有 order_by('foregin_key') 的情况下使用将不起作用。例如在 M2M 上(postgres、django 1.8)【参考方案3】:
Entity.objects.values_list('foreign_key', flat=True).distinct().order_by()

distinct 不适用于 out order by

在 order_by() 调用中使用的任何字段都包含在 SQL SELECT 中 列。这有时会在使用时导致意想不到的结果 与 distinct() 结合。如果您按相关领域的字段排序 模型,这些字段将被添加到选定的列中,并且它们可能 使其他重复的行看起来是不同的。由于额外 列不会出现在返回的结果中(它们只是为了 支持排序),有时看起来不明显的结果是 被退回。

同样,如果您使用 values() 查询来限制列 选中,在任何 order_by() (或默认模型)中使用的列 ordering) 仍然会涉及,并且可能会影响 结果。

这里的寓意是,如果您使用 distinct() 时要小心 按相关型号订购。同样,当使用 distinct() 和 values() 一起,当按不在的字段排序时要小心 values() 调用。

https://docs.djangoproject.com/en/dev/ref/models/querysets/#distinct

【讨论】:

天哪!奖励:order_by() 并没有真正订购,但解决了明显的问题。这简直是​​疯了。 这行得通吗?似乎 distinct 和 order by 需要使用 MIN 或 MAX 的两列解决方案才能正确排序。我猜测顺序只是按 values_list 字段排序,这可能不是模型的默认排序顺序。正确的解决方案是编写一个自定义查询: select value, min(sequence) as sequence from some_table group by value order by sequence; .order_by() 没有任何参数会清除查询集上的任何默认或现有排序。【参考方案4】:
Entity.objects.order_by('foreign_key').distinct('foreign_key')

如果您已经将它们作为列表,则将其转换为 set() 以获取不同的值。

【讨论】:

不是这种转换为 set 对内存来说是一个代价高昂的想法,因为 set() 一切都将被填充到内存中,而查询集在评估之前不会加载.. 并且转换为列表的东西也会评估查询集?? 套装未排序,因此您将取消 order_by,在某些情况下这很重要。

以上是关于Django Model - 获取不同的值列表的主要内容,如果未能解决你的问题,请参考以下文章

Django Annotate - 获取不同字段值的列表

Django - 每个不同状态的查询计数

与 django 不同的无效

是否可以访问由 ForeignKey Django 连接的不同表的值

Autodesk Forge 查看器 - 从“viewer.model.search”和“viewer.getSelection()”获取不同的值 dbId

Django model对象接口