我在Django文档中听到它优化,所以我做了一些实验。所以我这样做了:
>>> x = Artist.objects.only('id').filter()
>>> print x.query
SELECT "store_artist"."id" FROM "store_artist"
>>> y = Artist.objects.filter()
>>> print y.query
SELECT "store_artist"."id", "store_artist"."name", "store_artist"."birth_date" FROM "store_artist"
我可以看到查询已更改,但我做了进一步的测试:
>>> for _x in x:
... _x.name
...
u'Beyone'
u'Beyoneeee'
u'Beyone231231'
u'Beyone2222'
u'No Album'
>>> for _y in y:
... _y.name
...
u'Beyone'
u'Beyoneeee'
u'Beyone231231'
u'Beyone2222'
u'No Album'
所以如果你注意到它只是有相同的结果。那是怎么发生的?我认为在 y 变量中我刚刚获取了id,因此名称不应出现或无效
顺便说一句,这是我的模特:
class Artist(EsIndexable, models.Model):
name = models.CharField(max_length=50)
birth_date = models.DateField()
答案 0 :(得分:1)
它只查询你给它的字段,但它仍然返回该模型的实例。因此,当您要求使用其他字段时,您可能会进行第二次查询以获取名称
答案 1 :(得分:1)
.only方法返回一个不可追加的查询集,如果你想要一个新的查询集,你必须进行另一个查询才能得到它。当您拥有一个非常大的数据集并且您希望在业务逻辑中处理所有处理的唯一字段时,此方法很有用。 在你的情况下,我会建议使用defer()方法。您可以多次调用defer()。每次调用都会向延迟集添加新字段。所以现在,你想要在它中使用哪个值,以及你需要再次调用数据库以获取有助于优化和性能的值的主要内容。