2017-07-03 55 views
0

让我们假设我有一个通过django中的继承实现的父表和子表。Django在单个查询中选择继承的模型

models.py

class A(models.Model) 
a = CharField() 

class B(A): 
b = CharField() 

现在我想从表B选择列b我执行:

B.objects.only('b').get(id=4) 

但这个语句查询数据库2次:

SELECT `b`.`a_ptr_id`, `b`.`b` FROM `b` WHERE `b`.`a_ptr_id` = 4; args=(4,) 
SELECT `a`.`a`, `b`.`a_id` FROM `b` INNER JOIN `a` ON (`b`.`a_ptr_id` = `b`.`id`) WHERE `b`.`a_ptr_id` = 4; args=(4,) 

我如何创建使用django模型像select b from b where a_ptr_id = ?一样提供SINGLE查询?

我想单次查询数据库!

+0

该语句的数据库只提供线路的2个SQL查询的一个,你应该得到第二个,当你做'B.objects.only(“A” ).get(id = 4)',也许你打开数据库连接并打印所有的SQL查询? – HassenPy

+0

我刚刚用上面描述的完全相同的模型创建了新的应用程序。当我执行'B.objects.only('b')。get(id = 1)'时,它运行第一个查询。但只要我访问字段'b'(例如'print(b.b)'),它就会运行第二个查询。 – deathangel908

+0

下面是证明:下载'https:// static.pychat.org/ mysite2.zip',解包,在'settings.py'中指定你的数据库源文件(不能让日志工作到sqlight),执行'./manage。 python makemigrations mysite2','./manage.py migrate','./manage.py runserver 8888',打开'localhost:8888/ad' url并检查数据库中的日志。 – deathangel908

回答

1

事实证明,只生成了1个查询。第二个查询是因为我在调试模式下检查了所有这些。我的IDE自动评估对象而导致查询与

SELECT `a`.`a`, `b`.`a_id` FROM `b` INNER JOIN `a` ON (`b`.`a_ptr_id` = `b`.`id`) WHERE `b`.`a_ptr_id` = 4;