Django中多个字段中唯一值的dicts列表

时间:2011-01-04 12:43:01

标签: python django django-queryset

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

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循环,并且“不在”中检查唯一性。它有效,但速度太慢,因为'元素'可以有多达1.9M的成员。

有效的方法是什么?

更新

这是我迄今为止最好的,但必须有更快的方法:

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 :(得分:0)

如何使用'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]