Django: проблема с объединением наборов запросов после аннотации - PullRequest
0 голосов
/ 10 марта 2010

У меня есть менеджер для «Диалог», который выглядит так:

class AnnotationManager(models.Manager):
def get_query_set(self):
    return super(AnnotationManager, self).get_query_set().annotate(
        num_votes=Count('vote', distinct=True),
        num_comments=Count('comment', distinct=True),
        num_commentators = Count('comment__user', distinct=True),
    )

Голоса и комментарии имеют ForeignKey to Dialog. Комментарии имеет ForeignKey для пользователя. Когда я делаю это:

dialogs_queryset = Dialog.public.filter(organization=organization)
dialogs_popularity = dialogs_queryset.exclude(num_comments=0) | dialogs_queryset.exclude(num_votes=0)

... dialogs_popularity никогда не вернет комбинацию, а только диалоги с более чем 0 комментариями или, если я изменю порядок ИЛИ, диалоги с более чем 0 голосами!

Для меня ожидаемым поведением было бы получение диалогов с более чем 0 голосами И диалогов с более чем 0 комментариями.

Чего мне не хватает? Или здесь есть ошибка в поведении аннотации?

1 Ответ

0 голосов
/ 10 марта 2010

Хотели диалоги с голосами и комментариями?

# must have both a vote and a comment
# aka.  has_comments_and_votes = has_comments AND has_votes
#                              = !(has_no_comments OR has_no_votes)
has_comments = ~Q(num_comments=0)
has_votes = ~Q(num_votes=0)

dialogs_queryset.filter(num_comments__ne=0, num_votes__ne=0)
# or with Q objects
dialogs_queryset.filter(has_comments & has_votes)
dialogs_queryset.exclude(~has_comments | ~has_votes)

Или диалоги с голосами, комментариями или и тем, и другим. (Что вы хотите, основываясь на комментарии.)

# must have at least 1 vote or 1 comment
# aka. has_comments_or_votes = has_comments OR has_votes
#                            = !(has_no_comments AND has_no_votes)
dialogs_queryset.exclude(num_comments=0, num_votes=0)
# again with Q objects
dialogs_queryset.filter(has_comments | has_votes)  # easiest to read!
dialogs_queryset.exclude(~has_comments & ~has_votes)

Я добавил Q объектов примеров, потому что "|" в вашем примере кода, кажется, намекает на них, и они облегчают создание запросов ORed.

EDIT: Я добавил has_comments и has_votes, чтобы было легче читать.

...