2016-09-27 38 views
0

我在Django中創建模型。不允許從Django中的表中刪除行的外鍵約束

class ClientsModel(models.Model): 
    sys_id = models.AutoField(primary_key=True, null=False, blank=True) 
    tenant_sys_id = models.ForeignKey('tenant.TenantModel', on_delete = models.SET_NULL, null=True, blank=True) 
    last_name = models.CharField(max_length=40, null=True, blank=True) 
    # and few more rows. 

這裏tenant_sys_id是一個外鍵。我設置on_delete = models.SET_NULL,這意味着如果我從TenantModel中刪除任何條目(可以說是entry1),那麼將所有具有tenant_sys_id作爲entry1的行中的列tenant_sys_id設置爲null。我在這裏?
如果是 - 那麼這裏是下一個問題。如果我試圖從mysql中的租戶表中刪除一個條目,那麼它會拋出錯誤。

mysql> delete from tenants where sys_id = 1; 
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`sanstha_db`.`clients`, CONSTRAINT `Clients_tenant_sys_id_id_52191b87_fk_Tenants_sys_id` FOREIGN KEY (`tenant_sys_id_id`) REFERENCES `tenants` (`sys_id`)) 

這裏是表格結構。

Table: clients 
Create Table: CREATE TABLE `clients` (
    `sys_id` int(11) NOT NULL AUTO_INCREMENT, 
    `last_name` varchar(40) DEFAULT NULL, 
    `first_name` varchar(40) NOT NULL, 
    `middle_name` varchar(40) DEFAULT NULL, 
    `display_name` varchar(140) NOT NULL, 
    `is_business` tinyint(1) NOT NULL, 
    `is_active` tinyint(1) NOT NULL, 
    `is_vendor` tinyint(1) NOT NULL, 
    `is_authorized_to_expense` tinyint(1) NOT NULL, 
    `relation` bigint(20) DEFAULT NULL, 
    `dob` date DEFAULT NULL, 
    `gender` bigint(20) DEFAULT NULL, 
    `created_when` datetime DEFAULT NULL, 
    `created_by` bigint(20) DEFAULT NULL, 
    `last_updated_when` datetime DEFAULT NULL, 
    `last_updated_by` bigint(20) DEFAULT NULL, 
    `notes` varchar(2048) DEFAULT NULL, 
    `head_of_family_id` int(11) DEFAULT NULL, 
    `tenant_sys_id_id` int(11) DEFAULT NULL, 
    PRIMARY KEY (`sys_id`), 
    KEY `Clients_head_of_family_id_01c17980_fk_Clients_sys_id` (`head_of_family_id`), 
    KEY `Clients_tenant_sys_id_id_52191b87_fk_Tenants_sys_id` (`tenant_sys_id_id`), 
    CONSTRAINT `Clients_head_of_family_id_01c17980_fk_Clients_sys_id` FOREIGN KEY (`head_of_family_id`) REFERENCES `clients` (`sys_id`), 
    CONSTRAINT `Clients_tenant_sys_id_id_52191b87_fk_Tenants_sys_id` FOREIGN KEY (`tenant_sys_id_id`) REFERENCES `tenants` (`sys_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=20 DEFAULT CHARSET=latin1 

請建議我爲什麼它不是讓我刪除的條目?什麼是正確的方式來做到這一點。

+0

它說,你有'客戶'表的問題,而不是'用戶' –

+0

哦......對不起......更新的問題。 – User42

+0

您顯示的模型具有'tenant_sys_id'作爲'外鍵'。你在說'parent_sys_id'是一個'外鍵'。那麼還有更多'Models'還是錯誤地將'tenant_sys_id'寫爲'parent_sys_id'。因爲上述對我沒有任何意義。如果您上面寫的內容沒有錯誤,您能否以更好的例子來解釋這個情景? –

回答

0

所以,這裏是抓住。

on_delete = models.SET_NULL將用null值替換foreign key(您在父表中刪除的值)的值。

但上面會Django的時說,你寫一些邏輯在views.py刪除的tenants機型某行,因爲on_delete = Models.SET_NULLMySQL的的Django並沒有定義的東西來完成。

所以,當你這樣做,在你的views.py,那麼Django的解釋,然後使外鍵模型ClientsModel空,它從模型tenants刪除該行之後。

但是,如果你從使用MySQL的命令行的另一端,那麼你是不是Django的互動,直接從表tenants刪除一行。通過這種方式,在模型ClientsModel外鍵將不會被設置爲,因此你會得到foreign key constraint error

最後,在回答你的最後一個註釋。如果從Django中刪除一行,則不會出現此錯誤,無論您是使用Django的ORM還是原始SQL查詢。

+0

謝謝...得到它...但這些表是由Django的權利創建...所以爲什麼Django沒有創建表格,我們可以處理這種情況的形式終端也... – User42

+0

Django只是一個框架。 MySQL和Django是相互獨立的。您可以使用任何其他後端框架來執行相同的操作,並使用MySQL作爲數據庫。框架是一個層次,您可以根據自己的前臺如何與數據庫進行交互。因此,Django具有一些內置功能,它們以特定的方式將**寫入數據庫,但無法更改數據庫行爲的特徵屬性,無論是MySQL,PostgreSQL還是Mongo。 –

+0

如果您將使用'python manage.py shell'來刪除行,那麼它肯定會被處理,並且您將不會像現在通過** Django與您的數據庫**進行交互那樣得到錯誤。但是很明顯,如果你在另一個終端上使用'mysql -u root -p'並直接刪除一行而不讓Django知道它,你會得到錯誤。 –