按关系字段的两个不同聚合值排序

时间:2010-06-27 19:10:31

标签: django django-models

使用以下代码:

from django.db import models

class Blogpost(models.Model): pass

class Vote(models.Model):
    question = models.ForeignKey(Blogpost)
    TYPE_CHOICES = (
        ('up', 'Up-Votes'),
        ('dn', 'Down-Votes'),
    )
    type = models.CharField(max_length=2, choices=TYPE_CHOICES)

获取一组所有Blogposts的最佳方法是什么,先通过up-votes,然后是down-votes排序,而不通过QuerySet.extra()函数编写SQL?

1 个答案:

答案 0 :(得分:0)

更改投票选项的值,使它们是以所需方式排序的整数。

例如,向上投票可以是1,向下投票为-1,默认值可以是-2。

然后您可以使用单个order_by检索结果:

posts = Blogpost.objects.order_by('vote__type')

这提供了额外的优势,因为使用Sum聚合

变得很容易获得投票总数
from django.db.models import Sum
vote_score = Vote.objects.filter(question=blogpost_instance).filter(type__gte=-1).aggregate(Sum('type'))