Skip to main content
 首页 » 编程设计

python之来自 Django 中多个字段的唯一值的字典列表

2025年05月04日38TianFang

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

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 字段的唯一值,不包括空字符串。我目前正在使用带有“not in”的低效 for 循环来检查唯一性。它可以工作,但速度太慢,因为“元素”最多可以有 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)} 

请您参考如下方法:

如何使用“exclude”过滤数据库查询中的空名称?

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]