django 运行 什么时候查询 OneToOneField?

when does django run the query for a OneToOneField?

你好最聪明的答案守护者,我还不知道,

我在 Django 中使用一对一关系将一些额外字段附加到 Django 的用户模型。但是,我想知道这是否会导致我每次查找用户时都要 运行 一个额外的查询。考虑到我并不总是需要这些额外字段中的信息,这一点尤其令人担忧。

我无法找到任何关于 django 何时真正运行查询相关字段的信息(我能理解)。

一旦我 运行 我的初始查询(获取我的用户),是否立即查询 OneToOneField 运行,或者它是否使用一些 django 技巧仅 运行 如果我尝试访问相关字段?

如果第二个查询 运行 自动执行,有没有办法告诉 django 不要那样做?

提前感谢您分享您的智慧。

在您调用关系之前,Django 似乎不会运行查询

class Bar(models.Model):
    name = models.CharField(max_length=20)

class Foo(models.Model):
    bar = models.OneToOneField(Bar)

在shell中:

In [1]: Bar.objects.create(name='chocolate')
Out[1]: <Bar: Bar object>
In [2]: Foo.objects.create(bar=Out[1])
Out[2]: <Foo: Foo object>
In [3]: from django.db import connection
In [4]: connection.queries
Out[4]:
[{u'sql': u"QUERY = u'BEGIN' - PARAMS = ()", u'time': u'0.000'},
 {u'sql': u'QUERY = u\'INSERT INTO "myapp_bar" ("name") VALUES (%s)\' - PARAMS = (u\'chochalate\',)',
  u'time': u'0.001'},
 {u'sql': u"QUERY = u'BEGIN' - PARAMS = ()", u'time': u'0.000'},
 {u'sql': u'QUERY = u\'INSERT INTO "myapp_foo" ("bar_id") VALUES (%s)\' - PARAMS = (1,)',
  u'time': u'0.001'}]
In [5]: foo = Foo.objects.all()
In [6]: foo
Out[6]: [<Foo: Foo object>]
In [7]: connection.queries
Out[7]:
[
 # ... same as above ...
 {u'sql': u'QUERY = u\'SELECT "myapp_foo"."id", "myapp_foo"."bar_id" FROM "myapp_foo" LIMIT 21\' - PARAMS = ()',
  u'time': u'0.000'}] # bar is not queried 
In [8]: foo.bar
Out[8]: <Bar: Bar object>

In [9]: connection.queries
Out[9]:
[
 # ... same as above ...
 {u'sql': u'QUERY = u\'SELECT "myapp_bar"."id", "myapp_bar"."name" FROM "myapp_bar" WHERE "myapp_bar"."id" = %s LIMIT 21\' - PARAMS = (1,)',
  u'time': u'0.000'}] # now bar is queried