【问题标题】:List of dicts from unique values across multiple fields in Django来自 Django 中多个字段的唯一值的字典列表
【发布时间】:2011-01-04 12:43:01
【问题描述】:

我有一个包含模型元素实例的查询集“元素”。元素有一个外键“系列”,每个系列都有字段:

subtopic_1_name
subtopic_1_slug
subtopic_2_name
subtopic_2_slug
subtopic_3_name
subtopic_3_slug

我需要生成一个“扁平化”形式的字典列表

[{'name': 'somename', 'slug': 'someslug'}, {'name': 'anothername' 'slug': 'anotherslug'}, ... ]

其中 'name' 和 'slug' 对应于三个 name 和 slug 字段中的唯一值,不包括空字符串。我目前正在使用一个低效的 for 循环和'not in'来检查唯一性。它可以工作,但是太慢了,因为“元素”最多可以有 190 万个成员。

什么是有效的方法?

更新:

这是我目前最好的方法,但必须有更快的方法:

subtopic_list = []
ones = elements.values_list('series__subtopic1_name', 'series__subtopic1_slug').distinct()
twos = elements.values_list('series__subtopic2_name', 'series__subtopic2_slug').distinct()
threes = elements.values_list('series__subtopic3_name', 'series__subtopic3_slug').distinct()
for num in [ones, twos, threes]:
    for name, slug in num:
        if name != '':
            subtopic_list.append({'name': name, 'slug': slug)}

【问题讨论】:

    标签: python django django-queryset


    【解决方案1】:

    使用 'exclude' 过滤 db 查询中的空名称怎么样?

    ones = elements.exclude('series__subtopic1_name'='').\
       values_list('series__subtopic1_name','series__subtopic1_slug').distinct()
    
    twos = elements.exclude('series__subtopic2_name'='').\
       values_list('series__subtopic2_name', 'series__subtopic2_slug').distinct()
    
    threes = elements.exclude('series__subtopic3_name'='').\
       values_list('series__subtopic3_name', 'series__subtopic3_slug').distinct()
    
    # concatenate element of twos and threes into list 'ones'
    ones.extend(twos)
    ones.extend(threes)
    
    # we already filtered empty names in the db query,
    # so we can just return the subtopic_list
    subtopic_list = [{'name': name, 'slug': slug} for name, slug in ones]
    

    【讨论】:

    • 谢谢。我希望有一种方法可以避免对三个 distinct() 调用的需要,但这是更简洁的代码。
    • 为什么要去掉 distinct() 调用?这是可能的,但在您提到的问题中,您希望消除昂贵的 for 循环。
    猜你喜欢
    • 2021-03-18
    • 2022-12-31
    • 1970-01-01
    • 1970-01-01
    • 2010-11-13
    • 1970-01-01
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    相关资源
    最近更新 更多