Джанго аннотации и фильтрация - PullRequest
1 голос
/ 28 августа 2010

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

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 для этого.

Ура, Dave

- Триндаз на Феданге # Джанго

1 Ответ

2 голосов
/ 28 августа 2010

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

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

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'))

Обновление

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

Если Article имел столбец 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})
...