django - 将列表转换回查询集

76 投票
2 回答
90166 浏览
提问于 2025-04-15 12:33

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

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

在一个像这样的Profile类上:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

不幸的是,通用视图期待的是一个查询集对象,如果我给它一个列表,就会报错。

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

或者...

我能不能把一个列表转换成查询集呢? 在django文档中找不到这样的内容。

我希望不去非规范化数据,但如果必须的话,我想我会这么做。

更新 / 答案:

似乎要想得到一个查询集,唯一的方法就是把所有逻辑都放到sql查询里。

当这不可能时,(我认为)你需要非规范化数据。

2 个回答

118

好的……这篇帖子虽然有点旧,但你可以这样做:先获取你列表中所有对象的id,然后使用model.objects.filter(pk__in=list_of_ids)来筛选这些对象。

31

把数据列表再转换回查询是没有意义的。查询对象本身不存储数据,它只是用来表示对数据库的一个请求。如果你把列表变成查询,系统就得重新获取所有数据,这样做不仅多余,还会让性能变得很差。

你可以做的事情有:

  • 说明一下reputation字段是怎么计算的;可能可以通过某种方式在数据库中对数据进行排序。
  • 修改视图,使其不需要查询对象。如果需要进行额外的筛选等操作,最好在排序之前完成,因为这样排序时处理的数据量会更少(从数据库获取的数据也会更少)。所以你可以在把过滤后的查询对象发送到模板之前,先把它传给排序函数(模板不需要关心它是查询还是列表)。

撰写回答