Django фильтрует набор запросов - - PullRequest
0 голосов
/ 05 июля 2011

Я пытаюсь написать набор запросов, который отфильтровывает уникальные комбинации родитель / имя.Меня интересует только первое вхождение уникального родительского имени.

ID   PARENT TYPE       LIBTYPE NAME
1     1     project     1     book_a
4     4     project     2     book_b
5     4     project     2     book_c
6     4     project     2     book_d
7     4     project     4     book_c
8     5     project     2     book_e
9     5     project     4     book_e
10     7     project     0     book_f
11     7     project     0     book_g
12     7     project     6     book_h
13     6     user        1     book_i
14     6     project     1     book_j
15     6     project     1     book_k
16     7     project     5     book_h
17     7     project     8     book_h
18     7     project     7     book_h
19     7     project     9     book_h
20     7     project     1     book_h
21     8     project     1     book_a

Итак, мы начали с базового набора запросов ..

vars = Variants.objects.filter(type="project")

Это исключило одинокого пользователя ..Теперь в чистом Python я бы просто сделал это, чтобы отфильтровать эту присоску.

vars = Variants.objects.filter(type="project")
new_vars = []
for idx, var in vars.enumerate():
    if var.name not in new_vars:
        new_vars.append((var.parent,var.name))
    else:
        del vars[idx]

В конце я должен получить следующие идентификаторы (1,4,5,6,8,10,11,13,14,15,21). Я не могу перечислитьQueryset плюс Я уверен, что есть способ отфильтровать это в Django.

Может кто-нибудь, пожалуйста, пролить свет на то, как эффективно сделать это в Django?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Боюсь, ваше так называемое «чистое Python» решение не имеет смысла. Для начала, enumerate является встроенным, поэтому вы бы назвали enumerate(vars); во-вторых, вы добавляете кортеж к new_vars, чтобы var in new_vars никогда не было True; и в-третьих, я не вижу, что вы пытаетесь сделать с этим оператором del - вы никогда не должны изменять то, через что вы проходите.

Лучшее решение в Python может выглядеть примерно так:

var_dict = {}
for var in vars:
    if var.name not in var_dict:
        var_dict[var.name] = var

return var_dict.values()

, который так же хорошо работает с набором запросов.

Если я правильно понимаю, вы ищете решение на уровне БД. Это невозможно, так как функции агрегации работают на всей выбранной строке. Вы можете получить уникальные значения для (parent, name), но также не можете получить идентификатор - потому что (id, parent, name) не является уникальной комбинацией.

0 голосов
/ 05 июля 2011

Вот что я сделал - Дэн был прав, а я был костяком ..

projects = Variant.objects.filter(type="project")
filter_list, uniq_projs = [], []
for project in projects:
    if (project.name, project.parent) not in uniq_projs:
        uniq_projs.append((project.name, project.parent))
        filter_list.append(project.id)
projects = Variant.objects.filter(type="project", id__in=filter_list).order_by('parent__name')

Чувствую себя так глупо ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...