我有一个Django模型Document
,它可以有Vote
个对象指向它。 Vote
上有一个名为score
的整数字段。
我想根据指向文档的Vote
对象score=1
的数量来订购文档的查询集。即,具有最多正面投票的文档应该是查询集中的第一个。
Django可以吗?怎么样?
答案 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')
优点是它仍然显示没有正面评价的文件。