1. 程式人生 > 其它 >django 外來鍵刪除

django 外來鍵刪除

技術標籤:DjangoPythonpython

如果一個模型使用了外來鍵。那麼在對方那個模型被刪除掉後,該進行什麼樣的操作。可以通過 on_delete 來指定。可以指定的型別如下:

1、CASCADE:級聯操作。如果外來鍵對應的那條資料被刪除了,那麼這條資料也會被刪除。

def index(res):
    user = User.objects.get(pk=2)
    user.delete()
    return '刪除成功'

現在我們刪除User表中的id為2的資料,結果外來鍵關聯的資料也被刪除了:

2、PROTECT:受保護的。即只要這條資料引用了外來鍵的那條資料,那麼就不能刪除外來鍵的那條資料。如果強制刪除,會報錯:

3、SET_NULL:設定為空。如果外來鍵的那條資料被刪除了,那麼在本條資料上講就將這個欄位設定為空,如果設定這個選項,前提是要指定這個欄位可以為空( null = True )

class Article(models.Model):
    author = models.ForeignKey('User', on_delete=models.SET_NULL, null=True)

4、SET_DEFAULT:設定預設值。如果外來鍵的那條資料被刪除了,那麼本條資料上就將這個欄位設定為預設值。如果設定這個選項,前提是要指定這個欄位一個預設值。

如下:

如果我們刪除外來鍵關聯的那條資料,那麼author預設會把外來鍵關聯到User表中的id為2的資料中。

class User(models.Model):
    username = models.CharField(max_length=50)
    password = models.CharField(max_length=50)
    class Meta:
        db_table = 'User'
class Article(models.Model):
    title = models.CharField(max_length=100)
    content = models.TextField()
    author = models.ForeignKey('User', on_delete=models.SET_DEFAULT, null=True, default=User.objects.get(pk=2))
    class Meta:
        db_table = 'Article'

5、SET( ):如果外來鍵的那條資料被刪除了。那麼將會獲取SET函式中的值來作為這個外來鍵的值。SET函式可以接收一個可以呼叫的物件(比如函式或者方法),如果是可以呼叫的物件,那麼會將這個物件呼叫後的結果作為值返回回去。

效果與SET_DEFAULT一樣:

class User(models.Model):
    pass
class Article(models.Model):
    author = models.ForeignKey('User', on_delete=models.SET(User.objects.get(pk=2)), null=True)

6、DO_NOTHIMG:不採取任何行為。一切全看資料庫級別的約束。

以上這些選項只是Django級別的,資料級別依舊是RESTRICT(相當於 ORM 中的PROTECT):