我有一个名为Theme的模型。它有很多列,但我只需要检索名为" name"的字段,所以我这样做了:
Theme.objects.only("名称&#34)
但它不起作用,它仍在检索所有列。
PD:我不想使用values(),因为它只返回一个python字典。我需要返回一组模型实例,以访问其属性和方法。
答案 0 :(得分: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底部的说明。
答案 1 :(得分:0)
如果您想要的是一个列,我认为您要找的是.values()
而不是.only
。