【问题标题】:when does django run the query for a OneToOneField?django 何时运行 OneToOneField 查询?
【发布时间】:2015-03-01 04:09:33
【问题描述】:

您好,最聪明的回答者,但我不知道,

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

我无法找到任何关于 django 何时在相关字段上实际运行查询的信息(我可以理解)。

OneToOneField 的查询是在我运行初始查询(以获取我的用户)后立即运行,还是使用一些 django 技巧仅在我尝试访问相关字段时运行?

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

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

【问题讨论】:

    标签: python django one-to-one


    【解决方案1】:

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

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

    在外壳中:

    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 进行的实际查询,但我不知道它是什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 2016-03-10
    • 1970-01-01
    • 2020-08-03
    • 1970-01-01
    • 2021-11-24
    • 1970-01-01
    相关资源
    最近更新 更多