2017-07-03 56 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;