Надеюсь, этот набор результатов достаточно объяснителен:
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
Я не могу придумать, как включить логическое условие. Возможно, другие ответят на этот вопрос лучше.
Как насчет того, чтобы подумать немного по-другому? Если вы не возражаете против выполнения двух запросов, вы можете отфильтровать свои статьи в зависимости от того, проголосовал за них текущий вошедший в систему пользователь или нет. Что-то вроде этого:
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})