希望这个结果集足够解释:
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的东西。
干杯, 戴夫
- 关于Fedang的Trindaz #django
答案 0 :(得分:2)
我想不出包含布尔条件的方法。也许其他人可以更好地回答这个问题。
思考方式有点不同?如果您不介意执行两个查询,则可以根据当前登录用户是否对其进行投票来过滤您的文章。像这样:
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})