django注释和过滤

时间:2010-08-28 10:37:47

标签: python django django-models

希望这个结果集足够解释:

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

1 个答案:

答案 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})