Django中的级联删除

在django中的一对多关系里,默认存在着级联删除的属性。本文介绍了相关的属性设置。

在django中的一对多关系里,默认存在着级联删除的属性。

处理方法

如果不想删除班级的同时员工表也被一起删除,需要在员工的班级外键上增加 null=True, on_delete=models.SET_NULL

局部代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class NCoVStaff(models.Model):
    TEACHER = 1
    PRINCIPAL = 2
    TYPE_CHOICE = (
        (TEACHER, 'Teacher'),
        (PRINCIPAL, 'Principal'),
    )
    name = models.CharField(max_length=100)
    cellphone = models.TextField(blank=True, null=True)
    staff_type = models.SmallIntegerField(default=TEACHER, choices=TYPE_CHOICE)
    wechat_user = models.OneToOneField('nCoV.NCoVWeChatUser', related_name='ncov_staff')
    created_time = models.DateTimeField(auto_now_add=True)
    center = models.ForeignKey('centers.Center', related_name='ncov_staff_center')
    klass = models.ForeignKey('nCoV.NCoVKlass', related_name='ncov_staff_klass', null=True, blank=True, on_delete=models.SET_NULL)

    def __unicode__(self):
        return '{}'.format(self.name)


class NCoVKlass(models.Model):
    name = models.CharField(max_length=100)
    no_of_student = models.IntegerField()
    center = models.ForeignKey('centers.Center', related_name='ncov_classes')

    def __unicode__(self):
        return '{}'.format(self.name)

on_delete 可选属性

  • CASCADE 级联删除。 Django 默认选项,删除父项的同时会把子项一起删除。 删除子项时,子项的 Model.delete() 不会被调用, 但是pre_delete 和 post_delete 信号 signals 还是会捕获到。

  • PROTECT 删除子项时抛出 ProtectedError,属于 django.db.IntegrityError。

  • SET_NULL 把子项值设为 null; 子项同时要设置 null=True。

  • SET_DEFAULT 把子项值设为 default 值; 子项同时要设置 default=’…'

  • SET() 指定一个方法来处理,如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from django.conf import settings
from django.contrib.auth import get_user_model
from django.db import models

def get_sentinel_user():
    return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )
  • DO_NOTHING 什么都不干 一般会导致IntegrityError。
版权声明:本文为原创,依据 CC BY-NC-SA 4.0 许可证进行授权,转载请附上出处链接及本声明。