Упорядочивание запроса по совокупной сумме в Django, но не получение ожидаемого результата - PullRequest
6 голосов
/ 14 февраля 2012

Я пытаюсь создать сайт 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.

Однако результаты не такие, как ожидалось, и продукты заказываются отдельно от результатов голосования. Может кто-нибудь сказать мне, что не так с кодом здесь? И также, это правильный способ подойти к этому вопросу?

Спасибо

1 Ответ

10 голосов
/ 14 февраля 2012

Это кажется излишне сложным способом сделать это.Вы агрегируете голоса для каждого продукта отдельно, сохраняя результат в продукте, а затем упорядочивая по этим суммам голосов.

Вместо этого кажется, что вы должны делать все сразу:

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

(я предполагаю, что ваши исходные ссылки на sentence и b предназначены для обозначения product и p соответственно - в противном случае вам нужно будет предоставить более подробную информацию о том, что это на самом деле.) * +1010 *

...