我在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()

最佳答案

它仅查询您提供的字段,但仍返回该模型的实例。因此,当您请求其他字段时,您将进行第二次查询以获取名称

10-04 21:43
查看更多