我有一个名为“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模型中的另一个字段。
答案 0 :(得分:1)
在Django中,您可以传递给annotate
(和aggregate
)的内容必须是django.db.models.aggregates.Aggregate
的子类。您不能只是将任意Python对象传递给它,因为聚合/注释实际上发生在数据库中(这是aggregate
和annotate
的整点)。请注意,Django不支持编写自定义聚合(没有相关文档)。它上面提供的所有信息都是这个最小的源代码:https://code.djangoproject.com/browser/django/trunk/django/db/models/aggregates.py
这意味着您必须以某种方式将计算存储在数据库中,弄清楚聚合API的工作原理或使用管理器上的原始sql(raw
方法)来执行您的工作。