68

我有一些记录,我想根据计算值进行排序。在这里得到答案......就像这样:

sorted(Profile.objects.all(), key=lambda p: p.reputation)

在这样的 Profile 类上:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

不幸的是,通用视图需要一个查询集对象,如果我给它一个列表,则会引发错误。

有没有办法做到这一点,返回一个查询集

或者...

我可以以某种方式将列表转换为查询集吗?在 django 文档中找不到类似的东西。

我希望不要对数据进行非规范化,但我想如果必须的话我会的。

更新/答案:

似乎获取查询集的唯一方法是您是否可以将所有逻辑放入 sql 查询中。

如果这是不可能的,(我认为)你需要对数据进行非规范化

4

2 回答 2

109

好的...这篇文章现在已经过时了,但是您可以做的是获取ids列表中的所有对象,然后执行model.objects.filter(pk__in=list_of_ids)

于 2011-01-25T05:40:17.460 回答
26

将数据列表转换回查询是没有意义的。查询对象从不保存数据;它只是表示对数据库的查询。如果您将列表添加到查询中,它将不得不再次获取所有内容,这将是多余的并且在性能方面非常糟糕。

你可以做什么:

  • 描述如何reputation计算该字段;可能以某种方式对数据库中的数据进行排序。
  • 将视图修改为不需要查询对象。如果它需要进行额外的过滤等,这应该在任何排序之前完成,因为排序将花费更少的时间和更少的条目(并且将从数据库中获取的数据更少。)所以你可以将过滤后的查询对象发送到排序在您将其发送到模板之前的函数(它不应该关心它是查询还是列表。)
于 2009-06-29T13:02:28.780 回答