Django - 如何使用多个字段值注释QuerySet?

时间:2011-09-05 22:20:11

标签: django sorting aggregation django-queryset annotate

我有一个名为“Story”的模型,它有两个称为“views”和“votes”的整数字段。当我检索所有Story对象时,我想用“rank”字段注释返回的QuerySet,该字段只是“views”/“votes”。然后我想通过“排名”对QuerySet进行排序。有些东西......

Story.objects.annotate( ranking=CalcRanking('views','votes') ).sort_by(ranking)

我怎样才能在Django中这样做?或者应该在Python中检索QuerySet之后完成(比如创建一个包含QuerySet中每个对象的排名的列表)?

谢谢!

PS:在我的实际程序中,排名计算并不像上面那么简单,并且依赖于初始QuerySet的其他过滤器,因此我无法将其存储为Story模型中的另一个字段。

1 个答案:

答案 0 :(得分:1)

在Django中,您可以传递给annotate(和aggregate)的内容必须是django.db.models.aggregates.Aggregate的子类。您不能只是将任意Python对象传递给它,因为聚合/注释实际上发生在数据库中(这是aggregateannotate的整点)。请注意,Django不支持编写自定义聚合(没有相关文档)。它上面提供的所有信息都是这个最小的源代码:https://code.djangoproject.com/browser/django/trunk/django/db/models/aggregates.py

这意味着您必须以某种方式将计算存储在数据库中,弄清楚聚合API的工作原理或使用管理器上的原始sql(raw方法)来执行您的工作。