Список диктовок из уникальных значений в нескольких полях в Django - PullRequest
2 голосов
/ 04 января 2011

У меня есть набор запросов 'elements', содержащий экземпляры модели Element.У элементов есть внешний ключ '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 'соответствуют уникальным значениям из трех полей name и slug, исключая пустую строку.В настоящее время я использую неэффективный цикл for с «not in» для проверки уникальности.Это работает, но слишком медленно, потому что «элементы» могут иметь до 1,9 миллиона членов.

Какой эффективный способ сделать это?

Обновление:

Вот лучшее, что у меня есть, но должен быть более быстрый способ:

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 голосов
/ 04 января 2011

Как насчет фильтрации пустых имен в запросе базы данных с использованием '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]
...