【问题标题】:How to get a unique model instances, not values, using distinct?如何使用 distinct 获取唯一的模型实例,而不是值?
【发布时间】:2011-11-18 11:15:44
【问题描述】:

编辑

我有几条具有相同字段值的记录。我需要过滤查询集以获取模型实例包含唯一字段记录,而不仅仅是查询集中的值。 如何过滤查询集以保持实例只包含一个字段的唯一值?

>>> dist = Language.objects.distinct()
>>> for i in dist:
>>>     print i.language     
>>> English
>>> English

>>> dist = Language.objects.values('language').distinct()
>>> for i in dist:
>>>     print i['language']     
>>> English

【问题讨论】:

  • 嗯...为什么Language 模型的“语言”字段中有重复项?更重要的是,如果您有 N 个 Language 具有相同的“语言”,那么在不同的结果中您需要哪一个?
  • Model.object.all() 已返回唯一实例。只有当您开始将多个模型组合到一个查询中时,您可能会得到重复。不过,它们仍然是唯一的 Python 对象实例。
  • 哦,我明白了。我重新提出了这个问题。
  • @BéresBotond,您的第一个问题的答案太长)抱歉。我不在乎将获得哪个实例,重要的是没有重复。

标签: django django-queryset


【解决方案1】:

可能有一种更有效的方法,但首先想到的是:

ids = (lang['max_id'] for lang in Language.objects.values('language').annotate(max_id=Max('pk')))
results = Language.objects.filter(pk__in=ids)

基本上按语言分组并为每种语言选择具有最高 ID 的字段记录。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-30
    • 2018-02-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-17
    • 2011-04-27
    相关资源
    最近更新 更多