2012-02-14 4 views
4

제품 목록을 보여주는 Django 사이트를 만들려고하고 있으며받은 총 투표 점수로 주문합니다. 'Product'는 하나의 클래스이고 'Vote'는 score라고하는 필드가 1, 0 또는 -1 일 수있는 또 다른 클래스입니다. 각 특정 제품과 관련된 투표의 점수 합계에 따라 제품을 주문하길 원합니다. 여기 Django에서 집계 합계로 쿼리를 주문했지만 예상대로 결과를 얻지 못했습니다.

내 models.py입니다 :

class Product(models.Model): 
    Content = models.TextField() 
    creation_date = models.DateTimeField(default=datetime.now) 
    total_votes = models.IntegerField(default=0) 

    def __unicode__(self): 
      return self.content 

class Vote(models.Model): 
     voter = models.ForeignKey(User) 
     product = models.ForeignKey(Product) 
     score = models.IntegerField(default=0, choices=VOTE_SCORE_CHOICES) 
     def __unicode__(self): 
       return '%s - %s : %s' % (self.product.id, self.voter, self.score) 

그리고 여기 내 views.py입니다 :

def show_products(request): 
     product_list = Product.objects.all() 

     # set the field 'total_votes' in prduct to the sum of votes for each sentence 
     for p in product_list: 
       try: 
         v = Vote.objects.filter(product = p).aggregate(Sum('score'))['score__sum'] 
       except IndexError: 
         v = 0 
       p.total_votes = v 
     p.save() 

     # get the product that has the highest vote score 
     try: 
       top_product = product_list.order_by('-total_votes')[0].content 
     except IndexError: 
       top_product = 'no product' 

     # reorder product_list according to total_votes 
     product_list = product_list.order_by('total_votes') 

     return render_to_response('product/product_detail.html', 
         {'product_list': product_list, 
           'top_produce': top_product,}, context_instance=RequestContext(request)) 

그래서 당신은 내가 각 제품과 관련된 투표에 대한 점수의 합을 얻고있다 참조 이 번호를 각 제품의 'total_votes'필드에 할당 한 다음 'total_votes'에 따라 제품 목록을 재정렬하십시오.

그러나 예상대로 결과가 나오지 않으며 제품이 투표 점수와 별도로 주문됩니다. 누군가이 코드에 어떤 문제가 있다고 말할 수 있습니까? 또한이 문제에 접근하는 것이 올바른 방법입니까?

고맙습니다.

답변

8

이 작업은 불필요하게 복잡한 방법으로 보입니다. 각 제품에 대한 투표를 별도로 집계하여 결과를 제품에 저장 한 다음 해당 투표 합계로 주문합니다. 당신이 한 번에 모든 일을해야한다처럼 대신 그

는 것 같다

product_list = Product.objects.annotate(total_votes=Sum('vote__score')).order_by('total_votes') 

(I 각각 productp를 참조하기위한 것입니다 sentenceb에 초기 참조를 추정하고있어 - 그렇지 않으면 이들이 실제로 무엇인지에 대한 자세한 내용을 제공해야합니다.)

+0

오. 다니엘 고마워. 나는 그것을 시도 할 것이다. 그것은 지나치게 복잡하게 보였다. 그리고 예, 문장과 b에 대한 초기 참조는 제품과 p를 나타 내기위한 것입니다 (이름이 잘못 붙은 필드가 많아서 질문을 더 명확히하기 위해 이름을 바꾸기로했습니다. 지금 수정). – SecondMatter

+0

Daniel , 당신의 방식대로, 그리고 훨씬 더 나은 방법으로 그것을 할 수 있습니다. 그건 그렇고, 나는 이전에 p.save()를 들여 쓰지 않았으므로 for 루프에 포함시키지 않았다는 것을 깨달았다. – SecondMatter

관련 문제