2016-09-27 4 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からテナント表からエントリを削除しようとすると、エラーが表示されます。

ここにテーブル構造があります。

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

あなたは 'users'ではなく' clients'テーブルで問題があると言います –

+0

ああ...ごめんなさい...更新された質問。 – User42

+0

あなたが表示したモデルは 'foreign key'として' tenant_sys_id'を持っています。そして、あなたは 'parent_sys_id'が'外部キー 'であると言っています。だから 'モデル 'が増えているか、' tenant_sys_id'を誤って 'parent_sys_id'と書いたことがあります。上記のCozは本当に私に意味をなさないです。あなたが上に書いたことに間違いがなければ、良い例でシナリオを説明できますか? –

答えて

0

ここにキャッチがあります。

on_delete = models.SET_NULLは、foreign key(親テーブルで削除したもの)の値をnull値に置き換えます。

しかしon_delete = Models.SET_NULLMySQLのジャンゴないで定義された何かがあるよう言うあなたは、tenantsモデルのいくつかの行を削除するために、あなたのviews.pyにいくつかのロジックを記述する時には、上記ジャンゴによって行われます。

views.pyでこれを実行すると、Djangoはそれを解釈して、ClientsModelの外部キーをヌルにし、そのあとでモデルtenantsからその行を削除します。

しかし、あなたはMySQLのコマンドラインを使用して、別の端末から、あなたはジャンゴと相互作用しておらず、直接テーブルtenantsから行を削除することを行う場合。このように、モデルClientsModelの外部キーは、ヌルに設定されることはありませんので、あなたはforeign key constraint error

そして最後に、あなたの最後のコメントへの答えを得るでしょう。 DjangoのORMまたは生のSQL問合せを使用するかどうかにかかわらず、Djangoから行を削除すると、このエラーは発生しません。

+0

ありがとう...得ました...しかし、これらのテーブルはdjangoで作成されています...なぜdjangoはこのような方法でテーブルを作成していないのですか? – User42

+0

Djangoは単なるフレームワークです。 MySQLとDjangoは互いに独立しています。他のバックエンドフレームワークを使用して同じことを行い、データベースとしてMySQLを使用することができます。フレームワークは、フロントエンドがデータベースとやりとりする方法の論理に合ったレイヤーです。だから、Djangoにはデータベースに特別な方法で**書き込む機能がいくつかありますが、MySQL、PostgreSQL、Mongoのように、データベースの振る舞いの特性を変更することはできません。 –

+0

'python manage.py shell'を使用して行を削除すると、それは確実に処理され、** Djangoを介してデータベース**とやりとりしているので、エラーは発生しません。しかし、別の端末で 'mysql -u root -p'を使い、Djangoに知らせずに行を直接削除すると、明らかにエラーになります。 –

関連する問題