【问题标题】:how does django query work?django 查询是如何工作的?
【发布时间】:2016-04-02 09:09:03
【问题描述】:

我的模型是这样设计的

class Warehouse:
    name = ...
    sublocation = FK(Sublocation)

class Sublocation:
    name = ...
    city = FK(City)

class City:
    name = ..
    state = Fk(State)

现在如果我抛出一个查询。

wh = Warehouse.objects.value_list(['name', 'sublocation__name', 
    'sublocation__city__name']).first()

它返回正确的结果,但在内部它抛出了多少查询? django 是在一个请求中获取数据吗?

【问题讨论】:

    标签: django django-queryset


    【解决方案1】:

    Django 只对数据库进行一次查询以获取您描述的数据。 当你这样做时:

    wh = Warehouse.objects.values_list(
        'name', 'sublocation__name', 'sublocation__city__name').first()
    

    翻译成这个查询:

    SELECT "myapp_warehouse"."name", "myapp_sublocation"."name", "myapp_city"."name"
    FROM "myapp_warehouse" INNER JOIN "myapp_sublocation"
    ON ("myapp_warehouse"."sublocation_id" = "myapp_sublocation"."id")
    INNER JOIN "myapp_city" ON ("myapp_sublocation"."city_id" = "myapp_city"."id")'
    

    它在单个查询中获取结果。您可以像这样计算 shell 中的查询数:

    from django.db import connection as c, reset_queries as rq
    
    In [42]: rq()
    
    In [43]: len(c.queries)
    Out[43]: 0
    
    In [44]: wh = Warehouse.objects.values_list('name', 'sublocation__name', 'sublocation__city__name').first()
    
    In [45]: len(c.queries)
    Out[45]: 1
    

    【讨论】:

    • 我现在要花几个小时来测试我的所有查询,谢谢
    • 如果您的对象在 html 页面上呈现,您可以使用 django-debug-toolbar 代替。它会为你做到这一点:)
    【解决方案2】:

    我的建议是使用 assertNumQueries (docs here) 对此进行测试。

    from django.test import TestCase
    
    from yourproject.models import Warehouse
    
    class TestQueries(TestCase):
    
        def test_query_num(self):
            """
            Assert values_list query executes 1 database query
            """
            values = ['name', 'sublocation__name', 'sublocation__city__name']
            with self.assertNumQueries(1):
                Warehouse.objects.value_list(values).first()
    

    仅供参考,我不确定确实向数据库发送了多少查询,1 是我目前的最佳猜测。调整预期的查询数量以使其在您的项目中通过并固定需求。

    【讨论】:

      【解决方案3】:

      Django docs: QuerySet API Reference 中有大量关于如何以及何时评估查询集的文档。

      了解在页面呈现期间发生了多少查询以及发生了哪些查询的标准方法是使用Django Debug Toolbar。这可以准确地告诉您该记录集被评估了多少次。

      【讨论】:

        【解决方案4】:

        您可以使用 django-debug-toolbar 查看对 db 的真实查询

        【讨论】:

          猜你喜欢
          • 2020-07-26
          • 2013-03-14
          • 1970-01-01
          • 2018-11-25
          • 2014-02-07
          • 2019-09-16
          • 2017-05-31
          • 2014-07-20
          • 2012-03-03
          相关资源
          最近更新 更多