Необходимо аннотировать Django querySet, основываясь на том, какой объект Q был найден. - PullRequest
0 голосов
/ 11 августа 2011

Итак, у меня есть запрос с несколькими объектами Q, которые объединены в единое целое (для достижения UNION), и я хочу аннотировать каждый результат, с которым объект Q совпадал. Это так, когда я показываю результаты своего запроса, я могу выделить, какие поисковые запросы были хитами для каждого результата.

Вот код, который создает результирующий набор запросов:

Gene.objects.filter(Q(EC__EC='3.2.1.4')|Q(Protein_Family__name__in=famList)|Q(Pfam__Pfam__in=pfams),Protein_length__gte=100, Distance_From_Contig_Upstream__gte=10, Distance_From_Contig_Downstream__gte=10).distinct()

Я думаю, что я могу добавить этот аннотированный столбец, используя опцию .extra: https://docs.djangoproject.com/en/1.3/ref/models/querysets/#extra

Если я не могу сделать это, я, вероятно, сделаю три отдельных запроса, затем аннотирую результаты, затем ИЛИ наборы запросов вместе ... Я думаю, что это, вероятно, довольно расточительно и кажется неуклюжим.

1 Ответ

0 голосов
/ 11 августа 2011

Если вы аннотируете extra, окончательный distinct не будет работать.Если у вас есть одна запись (в таблице JOINed), соответствующая условию EC, а другая, соответствующая условию Protein.Family.name, то либо выдается одна из соответствующих записей (поэтому будет добавлен только соответствующий флаг), либовыдает все соответствующие записи (дублирует результаты в наборе результатов).

...