Я пытаюсь создать сайт Django, который показывает список продуктов и упорядочивает их по общему количеству полученных голосов. «Продукт» - это один класс, а «Голосование» - это другой, с полем, называемым счетом, которое может быть 1, 0 или -1. Я хочу, чтобы продукты заказывались в соответствии с суммой баллов за голоса, связанные с каждым конкретным продуктом.
Вот мои модели.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.
Однако результаты не такие, как ожидалось, и продукты заказываются отдельно от результатов голосования. Может кто-нибудь сказать мне, что не так с кодом здесь? И также, это правильный способ подойти к этому вопросу?
Спасибо