Python 什么?只有django queryset真的能做什么?

Python 什么?只有django queryset真的能做什么?,python,django,Python,Django,我在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_ar

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

它只查询您提供给它的字段,但仍然返回该模型的实例。因此,当您请求另一个字段时,您可能会进行第二次查询以获取名称

。.only方法会返回一个不可追加的查询集,如果您想要一个新的查询集,则必须进行另一次查询以获取该查询集。当您有一个非常大的数据集,并且希望业务逻辑中的所有处理都只有一个字段时,此方法非常有用。
在您的情况下,我建议使用defer()方法。您可以对defer()进行多次调用。每次调用都会向延迟集添加新字段。因此,现在,您可以在其中选择要使用的值,您不需要再次调用数据库来获取值,这有助于优化和性能。

哦,所以我的查询增加了一倍,而不仅仅是一倍?在这种情况下,是的,但仅使用一次,您就表示不需要其他fieldsOk,我只是想知道这是怎么发生的。。当我知道它不应该再被获取时,没有包含在其中的字段只是被延迟了,所以你仍然可以使用它们,但是你需要另一个db调用来获取它们的值是的,你回答了main,但是为什么它仍然可以获取那些没有包含的字段呢?