django - 将列表转换回查询集

时间:2009-06-29 12:57:18

标签: python django list sorting django-queryset

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

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

在这样的Profile类上:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

不幸的是,通用视图需要一个queryset对象,如果我给它一个列表就会抛出错误。

有没有办法执行此操作以返回查询集

...或

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

我希望不对数据进行反规范化,但我想如果必须的话我会这样做。

更新/答案:

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

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

2 个答案:

答案 0 :(得分:86)

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

答案 1 :(得分:21)

将数据列表转换回查询没有意义。查询对象永远不会保存数据;它只代表对数据库的查询。如果你将列表提交给查询,它将不得不再次获取所有内容,这将是多余的,并且在性能方面非常糟糕。

你能做什么:

  • 描述如何计算reputation字段;它可能以某种方式在数据库中订购数据。
  • 修改视图以不需要查询对象。如果它需要进行额外的过滤等,这应该在任何排序之前完成,因为排序将花费更少的时间用更少的条目(并且将从数据库中获取更少的数据。)因此,您可以将过滤的查询对象发送到排序在您将模板发送到模板之前的功能(不应该关心它是查询还是列表。)