簡體   English   中英

為什么我的模型的“on_delete = models.CASCADE”不生成級聯外鍵約束?

[英]Why doesn't my model's “on_delete=models.CASCADE,” generate a cascading foreign key constraint?

我正在使用Django,Python 3.7和PostgreSQL 9.5。 如何標記我的模型,以便生成級聯外鍵約束? 我目前在models.py文件中有這個...

class ArticleStat(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, )

當我在管理控制台中運行make migrations my_project時,它會生成一個包含此文件的文件...

    migrations.CreateModel(
        name='ArticleStat',
        fields=[
            ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
            ...
            ('article', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='my_project.Article')),
        ],
    ),

但是,當我運行遷移(使用migrate my_project 0001 )時,生成的外鍵不包含級聯刪除約束。 這就是PostgreSQL中的描述......

"my_project_articlesta_article_id_a02a5add_fk_my_project" FOREIGN KEY (article_id) REFERENCES my_project_article(id) DEFERRABLE INITIALLY DEFERRED

我怎么能得到我的models.py文件輸出級聯刪除外鍵約束?

ForeignKey django的django文檔中所述僅僅模擬此行為而不是將其推遲到數據庫。

Django模擬SQL約束ON DELETE CASCADE的行為,並刪除包含ForeignKey的對象。

所以回答你的問題:這是預期的行為,並且仍然會像你期望它在數據庫級別上工作一樣工作。

我怎么能得到我的models.py文件輸出級聯刪除外鍵約束?

您不能因為django目前不支持此功能。 但是有一張票要討論添加它: https//code.djangoproject.com/ticket/21961


編輯以進一步說明如何在數據庫級別強制執行此操作

雖然我強烈建議讓django為你處理這個,但可能有理由不這樣做。

要退出數據庫表創建或刪除操作,可以在ArticleStatMeta類中將Options.managed設置為False 但這也意味着您現在負責手動執行遷移,例如編寫CREATE TABLE語句來定義包含外鍵約束的表(因此您可以完全控制它)。 要考慮的另一個考慮因素是,您應該指示django不再對刪除引用的Article對象做任何事情(因為您的數據庫現在對此負責)。 通過將on_delete設置為models.DO_NOTHING可以確保這一點

ArticleStat放在一起現在看起來像這樣:

class ArticleStat(models.Model):
    article = models.ForeignKey(Article, on_delete=models.DO_NOTHING)

    class Meta:
        managed = False

關於信號的評論促使我重新審視並列出了一些需要考慮的陷阱。

  • 選擇退出意味着選擇退出django信號。 特別是不再為級聯對象觸發pre_deletepost_delete

  • 正如票證說明中所提到的,混合數據庫和django-cascading不能很好地融合在一起。

    如果模型A使用CASCADE_DB引用模型B,但模型B使用常規CASCADE引用模型C,則刪除A將不會一直級聯到C.

話雖如此,我找不到任何明確的證據,說明為什么django正在以目前的方式處理它。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM