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
你好最聪明的答案守护者,我还不知道,
我在 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