2

我有一个名为“Story”的模型,它有两个名为“views”和“votes”的整数字段。当我检索所有 Story 对象时,我想用一个简单的“视图”/“投票”的“排名”字段来注释返回的 QuerySet。然后我想通过“排名”对 QuerySet 进行排序。类似于...的东西

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

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

谢谢!

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

4

1 回答 1

1

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

这意味着您要么必须以某种方式将计算存储在数据库中,要么弄清楚聚合 API 是如何工作的,或者使用原始 sql(raw管理器上的方法)来完成你所做的事情。

于 2011-11-17T14:23:28.220 回答