2012-02-19 135 views

回答

2

當您創建ManyToManyField而未指定中間表時(使用through)Django會爲您生成一個表。這個表格只需要兩個模型的pks,所以不需要從其他對象中選擇任何東西來保存新的關聯關係。

將爲它們中的每一個創建一個新行,可能使用許多插入,但不一定需要很多數據庫調用(例如,可能有多個插入命令的單個SQL查詢)。這些創建(對象的pks)所需的所有信息都可用,因此不需要任何更多的數據庫命中。

更新:似乎我錯了。縱觀源(Django的/ DB /模型/場/ related.py),我看到它執行對每個對象的獨立創作:在做之前是

for obj_id in new_ids: 
    self.through._default_manager.using(db).create(**{ 
     '%s_id' % source_field_name: self._pk_val, 
     '%s_id' % target_field_name: obj_id, 
    }) 

,它還會檢查是否有任何PKS供應在數據庫中已經存在(爲了避免重複的條目/唯一約束違規):使用

vals = self.through._default_manager.using(db).values_list(target_field_name, flat=True) 
vals = vals.filter(**{ 
    source_field_name: self._pk_val, 
    '%s__in' % target_field_name: new_ids, 
}) 
new_ids = new_ids - set(vals) 

該檢查雖然有一個查詢做...

0

你有沒有試過檢查自己QuerySet.query屬性?

+3

'add'和'remove'沒有查詢屬性來檢查,但也有類似的方法。執行'from django.db import connection',然後在添加或刪除多對多關係之前和之後打印'connection.queries'。 – Alasdair 2012-02-19 16:12:55

+0

謝謝,不知道。 – side2k 2012-02-20 04:03:31