Django 查询如何工作?
how does django query work?
我的模型是这样设计的
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()
它 returns 正确的结果,但在内部它抛出了多少查询? django 是在一个请求中获取数据吗?
我的建议是使用 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 是我目前的最佳猜测。调整希望在您的项目中传递此信息的查询数量并确定要求。
Django docs: QuerySet API Reference.
中有大量关于如何以及何时评估查询集的文档
要深入了解在页面呈现期间发生了多少查询和哪些查询,最标准的方法是使用 Django Debug Toolbar。这可以准确地告诉您这个记录集被计算了多少次。
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
您可以使用 django-debug-toolbar 查看对 db 的真实查询
我的模型是这样设计的
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()
它 returns 正确的结果,但在内部它抛出了多少查询? django 是在一个请求中获取数据吗?
我的建议是使用 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 是我目前的最佳猜测。调整希望在您的项目中传递此信息的查询数量并确定要求。
Django docs: QuerySet API Reference.
中有大量关于如何以及何时评估查询集的文档要深入了解在页面呈现期间发生了多少查询和哪些查询,最标准的方法是使用 Django Debug Toolbar。这可以准确地告诉您这个记录集被计算了多少次。
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
您可以使用 django-debug-toolbar 查看对 db 的真实查询