Model.objects.only("列名") 无效,显示全部内容
我有一个叫做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 次查询。
only
和 defer
这两个方法应该只在高级用法中使用,也就是在你发现需要优化的时候,并且在仔细分析过你的代码之后。即使这样,通常还有其他更好的方法可以替代延迟加载字段。请查看 defer
的文档底部的说明 documentation。