django - 将列表转换回查询集
我有一些记录,想根据计算出来的值进行排序。我在这里找到了答案 在这里... 就像这样:
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
字段是怎么计算的;可能可以通过某种方式在数据库中对数据进行排序。 - 修改视图,使其不需要查询对象。如果需要进行额外的筛选等操作,最好在排序之前完成,因为这样排序时处理的数据量会更少(从数据库获取的数据也会更少)。所以你可以在把过滤后的查询对象发送到模板之前,先把它传给排序函数(模板不需要关心它是查询还是列表)。