2009-06-29 39 views
44

我有一些记录,我想基于计算值进行排序。得到的答复over here ...像这样:django - 将列表转换回查询集

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

在Profile类是这样的:

class Profile(models.Model): 

    ... 

    @property 
    def reputation(self): 
     ... 

不幸的是,一般的观点是期待一个QuerySet对象,并抛出一个错误,如果我给它一个列表。

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

或...

我可以转换列表到查询集不知何故?在django文档中找不到类似的东西。

我希望不要使数据非规范化,但我想我会如果我必须。

更新/答:

似乎得到查询集回来的唯一方法是,如果你可以得到所有你的逻辑到SQL查询。

当那是不可能的,(我认为),你需要进行非规范化的数据

+2

是不是一个更好的问题“我如何将列表(或字典)传递到通用视图”?我假设你是否解决了这个问题,那么无论你是通过转换为查询集还是不这样做...... – 2009-06-30 09:45:47

+0

是的......这是,但我只是想知道是否有一种简单的方法将其转换为一个查询集,然后我去分叉通用视图;) – Jiaaro 2009-06-30 16:17:01

+2

mods,这不是重复的。答案是这样的一个不同的问题:“你不能这样做,所以你必须做其他事情。”另一个问题描述了“别的东西”。 – Jiaaro 2015-08-06 15:32:06

回答

21

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

你可以做什么:

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

好吧...这个职位是现在老了,但你可以做的就是让所有的ids您的列表中的对象,然后执行model.objects.filter(pk__in=list_of_ids)