1

私は次のモデルを持っています:

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 %}

アドバイスをいただければ幸いです。

4

1 に答える 1

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 %}
于 2012-05-19T02:25:13.030 に答える