Django ORM - 如何组合注释和过滤器

时间:2012-05-19 00:14:04

标签: python django orm django-templates

我有以下型号:

class UserProfile(models.Model):
    user = models.ForeignKey(User, unique=True, related_name='profile')
    starred_authors = models.ManyToManyField(Author, related_name='users_with_stars')

class Author(models.Model):
    name = models.CharField(max_length=250)
    slug = models.SlugField(unique=True)

然后在作者模板中,我想说明当前登录的用户是否已经为该作者加星标,但是我在构建合适的查询以使用ORM获取此数据时遇到了麻烦。

在视图中,我曾想过如果作者尚未加星标,则计数注释的作者对象为0,如果加星标,则为1。像这样:

def author_detail(request, slug):
    user_id = request.user.pk
    author = Author.objects.filter(slug=slug).filter(users_with_stars__user__pk=user_id).annotate(fav=Count('users_with_stars'))[0]
    return render_to_response('app/author_detail.html',
                              { 'author': author},
                              context_instance=RequestContext(request)) 

但上述情况并不好,因为如果当前用户没有为作者加星标,则找不到任何对象。我想要做的是以某种方式将最后一个过滤器放在注释中,但我无法使其工作。

理想情况下,我希望在模板中执行以下操作:

{% if author.fav %}
    <p>This is one of your favorite authors</p>
{% endif %}

感谢任何建议。

1 个答案:

答案 0 :(得分:4)

我可能会将其拆分为模板字典中的单独属性,并通过直接检查此用户是否在由该作者加星标的用户列表中来计算它。

类似的东西:

[...]
author = Author.objects.filter(slug=slug)
is_fav = author.users_with_stars.filter(pk=user_id).exists()
return render_to_response('app/author_detail.html',
                          { 'author': author,
                            'is_fav': is_fav },
                          context_instance=RequestContext(request))

在模板中:

{% if is_fav %}
    <p>This is one of your favorite authors</p>
{% endif %}