django аннотация и фильтрация

Надеюсь, этот набор результатов достаточно объяснителен:

title             text            total_score    already_voted
-------------     ------------    -----------    -------------
BP Oil spi...     Recently i...   5              0
J-Lo back ...     Celebrity ...   7              1
Don't Stop...     If there w...   9              0
Australian...     The electi...   2              1

Файл моих моделей описывает статью (автор, текст, название) и голосование (участник, дата, оценка). Я могу получить первые три столбца просто со следующим:

articles = Article.objects.all().annotate(total_score=Sum('vote__score'))

, но вычисление 4-го столбца, который является логическим значением, описывающим, поместил ли текущий вошедший в систему пользователь какой-либо из голосов в столбце 3, немного за мной в момент! Надеюсь, есть что-то, что не требует сырого SQL для этого.

Приветствия, Дэйв

- Trindaz в Fedang #django

1
задан Trindaz 28 August 2010 в 10:37
поделиться

1 ответ

Я не могу придумать, как включить логическое условие. Возможно, другие ответят на этот вопрос лучше.

Как насчет того, чтобы подумать немного по-другому? Если вы не возражаете против выполнения двух запросов, вы можете отфильтровать свои статьи в зависимости от того, проголосовал за них текущий вошедший в систему пользователь или нет. Что-то вроде этого:

all_articles  = Article.objects.all()

articles_user_has_voted_on = all_articles.filter(vote__caster  = 
         request.user).annotate(total_score=Sum('vote__score'))

other_articles = all_articles.exclude(vote__caster  = 
         request.user).annotate(total_score=Sum('vote__score'))

Обновление

После некоторых экспериментов мне удалось выяснить, как добавить логическое условие для столбца в той же модели (Статья в данном случае ), но не для столбца в другой таблице (Vote.caster).

Если Статья имела столбец caster:

Article.objects.all().extra(select = {'already_voted': "caster_id = %s" % request.user.id})

В нынешнем состоянии это можно применить к модели Vote:

Vote.objects.all().extra(select = {'already_voted': "caster_id = %s" % request.user.id})
2
ответ дан 2 September 2019 в 21:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: