Django复杂的订购

时间:2014-06-01 19:43:52

标签: python django orm

我有一个Django模型Document,它可以有Vote个对象指向它。 Vote上有一个名为score的整数字段。

我想根据指向文档的Vote对象score=1的数量来订购文档的查询集。即,具有最多正面投票的文档应该是查询集中的第一个。

Django可以吗?怎么样?

2 个答案:

答案 0 :(得分:2)

这是注释工作。

from django.db.models import Count
Document.objects.filter(score=1).annotate(
             positive_votes=Count('vote__count')).order_by('positive_votes')

修改

没有过滤就没有办法做到这一点,因为这是基础数据库操作的工作方式。但是,一种不太好的方法是对原始中未包含的所有文档进行单独查询,并将两个查询集链接在一起:

positive_docs = <query from above>
other_docs = Document.objects.exclude(id__in=positive_docs)
all_docs = itertools.chain(positive_docs, other_docs)

只要您没有数百万个文档,这样就可以工作,但会破坏分页之类的内容。

答案 1 :(得分:0)

我做了这个(在QuerySet模型上):

def order_by_score(self):
    q = django.db.models.Q(ratings__score=1)
    documents_with_one_positive_rating = self.filter(q) # Annotation sees only
                                                        # the positive ratings
    documents_without_one_positive_rating = self.filter(~q)

    return (documents_with_one_positive_rating |
            documents_without_one_positive_rating).annotate(
                db_score=django.db.models.Count('ratings')
                ).order_by('-db_score')

优点是它仍然显示没有正面评价的文件。