一尘不染

django-将列表转换回queryset

django

我有一些记录要根据计算值排序。在这里得到答案…就像这样:

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

在像这样的Profile类上:

class Profile(models.Model):

    ...

    @property
    def reputation(self):
        ...

不幸的是,通用视图期望有一个queryset对象,如果我给它一个列表,则会抛出一个错误。

有没有一种方法可以返回查询集

要么…

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

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

更新/回答:
看来,取回一个查询集的唯一方法是是否可以将所有逻辑都放入sql查询中。

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


阅读 2045

收藏
2020-03-27

共2个答案

一尘不染

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

你可以做什么:

  • 描述如何reputation计算该字段;有可能以某种方式对数据库中的数据进行排序。
  • 修改视图以不需要查询对象。如果需要进行其他过滤等操作,则应在进行任何排序之前完成,因为排序将花费更少的时间并具有更少的条目(并且将从数据库中获取的数据更少。)因此,你可以将过滤后的查询对象发送到排序函数在将其发送到模板之前就可以使用(它不在乎是查询还是列表)。
2020-03-27
一尘不染

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

2020-03-27