Model.objects.only("列名") 无效,显示全部内容

0 投票
2 回答
712 浏览
提问于 2025-04-18 02:25

我有一个叫做Theme的模型。这个模型里面有很多字段,但我只想获取一个叫“name”的字段,所以我这样写:

Theme.objects.only("name")

但是这样并没有效果,它还是把所有的字段都取回来了。

补充说明:我不想用values(),因为它只会返回一个Python字典。我需要的是一组模型实例,这样我才能访问它们的属性和方法。

2 个回答

0

如果你想要的是一列数据,我觉得你需要用的是 .values(),而不是 .only

1

使用 only 或它的对应方法 defer 并不会阻止你访问那些延迟加载的属性。它们只是把获取这些属性的时间推迟到你真正需要用到它们的时候。举个例子:

for theme in Theme.objects.all():
    print theme.name
    print theme.other_attribute

在这个例子中,当循环开始时,会执行一次查询。现在再看看下面这个例子:

for theme in Theme.objects.only('name'):
    print theme.name
    print theme.other_attribute

在这个情况下,other_attribute 在循环开始时并没有在初始查询中加载。不过,它被加入到了模型的延迟属性列表中。当你尝试访问它时,会再执行一次查询来获取 other_attribute 的值。在第二个例子中,对于 n 个 Theme 对象,总共会执行 n+1 次查询。

onlydefer 这两个方法应该只在高级用法中使用,也就是在你发现需要优化的时候,并且在仔细分析过你的代码之后。即使这样,通常还有其他更好的方法可以替代延迟加载字段。请查看 defer 的文档底部的说明 documentation

撰写回答