django | 為 model 定義邏輯外來鍵

kingron發表於2024-06-25

問題

想要在 orm 中定義外來鍵,便於關聯查詢,但不想在資料庫中生成實際的外來鍵約束。


解決方式

DjangoForeignKey 和資料庫的 FOREIGN KEY 並不一樣。DjangoForeignKey 是一種邏輯上的兩個表的關聯關係,可以指定是否使用資料庫的 FOREIGN KEY 約束。
如:

from django.db import models


class Province(models.Model):
    name = models.CharField(max_length=16)

    def __unicode__(self):
        return self.name


class City(models.Model):
    name = models.CharField(max_length=16)
    province = models.ForeignKey(Province, null=True, on_delete=models.DO_NOTHING, related_name='cities', db_constraint=False)

如果 ForeignKey 不新增 db_constraint=False 引數,會在資料庫中使用外來鍵約束。
另外,ForeignKeyon_delete 引數預設為 on_delete=models.CASCADE,表示使用資料庫的級聯刪除,使用 on_delete=models.SET_NULL 可以使刪除 Province 時將關聯的 City 表對應的 province_id 值設為 NULL
使用這種方式不會破壞 Django 的反向關聯查詢。


參考

Django 的 ForeignKey 與資料庫的 FOREIGN KEY約束_我的總結積累與分享-CSDN部落格

相關文章