2017-02-17 15 views
0

私は2つのモデル、投稿と投票があります。ユーザーは投稿をアップヴォートとダウンボートできます。Django投稿あたりの投票の合計を取得

models.py:

class Post(models.Model): 
    poster = models.ForeignKey('auth.User') 
    question = models.ForeignKey('self', null=True, blank=True) 
    post_title = models.CharField(max_length=300) 
    post_content = models.TextField(null=True, blank=True) 

    is_published = models.BooleanField(default=True) 
    is_locked = models.BooleanField(default=False) 
    is_question = models.BooleanField(default=True) 
    is_deleted = models.BooleanField(default=False) 

    created_date = models.DateTimeField(
      default=timezone.now) 
    published_date = models.DateTimeField(
      blank=True, null=True) 
    date_modified = models.DateTimeField(
      blank=True, null=True) 

    def publish(self): 
     self.published_date = timezone.now() 
     self.save() 

    def __str__(self): 
     return self.post_title 

class Vote(models.Model): 
    user = models.ForeignKey('auth.User') 
    post = models.ForeignKey('Post') 
    vote_type = models.SmallIntegerField()#-1, 0, 1 
    date_voted = models.DateTimeField(
      default=timezone.now) 
    def __str__(self): 
     return self.user 

私はテンプレートに投稿を戻すために私の見解では、次のコードを使用します。

views.py:

def index(request): 
    posts = Post.objects.filter(created_date__lte=timezone.now(
    ), is_question=1, is_published=1).order_by('-created_date') 
    #removed the paging stuff here for simplification 
    return render(request, 'homepage/index.html', {'posts': posts}) 

これはちょうど記事を返しますしかし、私はまた、各投稿のvote_type列の合計が投稿の総投票数であることを望んでいます。

現在、各投稿のテンプレートタグを使用して、各投稿の投票を確認しています。

私のindex.htmlサンプルコード:{{post.total_votes}}:

{% for post in posts %} 
     {{ post|total_votes|default:"0" }} 
    {% endfor %} 

はviews.pyですべてを照会すると、テンプレートに、私はこのようにチェックできる方法はありますか?

答えて

2

ええと、annnotateを使用できます。その後、total_votes属性を持つことになります一般的に、それはpostsに各postオブジェクト

from django.db.models import Sum 
posts = Post.objects.filter(...).annotate(total_votes=Sum('vote__vote_type')) 

ようになります。

関連する問題