django查询如何工作?

时间:2016-04-02 09:09:04

标签: django django-queryset

我的模型设计如此

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是在一个请求中获取数据吗?

4 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

我的建议是使用assertNumQueriesdocs 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是我目前的最佳猜测。调整预期在项目中传递的查询数量并确定需求。

答案 2 :(得分:0)

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

使用Django Debug Toolbar可以非常标准地了解在页面呈现期间发生的查询次数和查询次数。这可以准确地告诉您该记录集的评估次数。

答案 3 :(得分:-1)

您可以使用django-debug-toolbar查看对db

的真实查询