Django中多个字段的唯一值生成字典列表
我有一个叫做 'elements' 的查询集,这里面包含了一些模型 Element 的实例。每个 Element 都有一个外键 'series',而每个 series 里有一些字段:
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' 对应的是三个名称和 slug 字段中的唯一值,空字符串要排除在外。目前我使用的是一个效率不高的 for 循环,里面用 'not in' 来检查唯一性。虽然这样可以工作,但速度太慢,因为 'elements' 里面可能有多达 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)}
1 个回答
0
在数据库查询中,使用'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]