浅谈Django 的删除策略:PROTECT、CASCADE、SET_NULL、SET_DEFAULT

概要

最近学习django框架,遇到数据库模型的删除策略问题的小细节,在csdn上搜不太到有关资料,故叙述如下:

技术名词解释

`
Django 的删除策略分为几个级别,分别对应不同的应用场景:

  1. “PROTECT”(默认值):这个策略是用来保护多个模型之间的一对多关系。当一个外键关联的模型被删除时,Django 会自动保护与之相关的模型实例不被删除。这种保护是基于数据库的,所以在数据库层面上,相关的模型实例不会被删除。

  2. “CASCADE”:这个策略是用来级联删除。当一个模型被删除时,Django 会自动删除与其关联的模型实例。这种删除是级联的,它会递归地删除所有与该模型相关的记录。

  3. “SET_NULL”:这个策略是用来将外键设置为 null。当一个模型被删除时,Django 会自动将与之关联的模型的外键设置为 null。这种操作会改变数据库的数据结构,但不会删除与之关联的模型实例。

  4. “SET_DEFAULT”:这个策略是用来将外键设置为默认值。当一个模型被删除时,Django 会自动将与之关联的模型的外键设置为默认值。这种操作会改变数据库的数据结构,但不会删除与之关联的模型实例。

小结

`
在实际应用中,你需要根据具体的情况选择合适的删除策略。例如,如果你需要保护一对多关系,可以使用 “PROTECT” 策略;如果你需要级联删除,可以使用 “CASCADE” 策略;如果你需要将外键设置为 null,可以使用 “SET_NULL” 策略;如果你需要将外键设置为默认值,可以使用 “SET_DEFAULT” 策略。
以上是我的项目的案例,采用了PROTECT策略。

# 藏品
class Collection(models.Model):
    number = models.CharField('藏品编号', max_length=13, unique=True)
    title = models.CharField(max_length=100, verbose_name='藏品名')
    collect_date = models.DateField(verbose_name='拍摄日期')
    # collect_date = models.DateField(verbose_name='收藏')
    status = models.CharField(max_length=100, verbose_name='保存状况', default='完整')
    size = models.CharField(max_length=100, verbose_name='规格', blank=True)
    some_details = models.TextField(max_length=2000, verbose_name='详情', blank=True)
    remark = models.TextField(max_length=2000, verbose_name='备注', blank=True)
    # starting_price = models.FloatField(max_length=100, verbose_name='入手价', default=0)
    # market_price = models.FloatField(max_length=100, verbose_name='市场价', default=0)
    file_obj = models.ImageField(verbose_name='图片', upload_to='collection_img', blank=True)
    '''
    Django 的删除策略分为几个级别,分别对应不同的应用场景:

1. "PROTECT"(默认值):这个策略是用来保护多个模型之间的一对多关系。当一个外键关联的模型被删除时,Django 会自动保护与之相关的模型实例不被删除。这种保护是基于数据库的,所以在数据库层面上,相关的模型实例不会被删除。

2. "CASCADE":这个策略是用来级联删除。当一个模型被删除时,Django 会自动删除与其关联的模型实例。这种删除是级联的,它会递归地删除所有与该模型相关的记录。

3. "SET_NULL":这个策略是用来将外键设置为 null。当一个模型被删除时,Django 会自动将与之关联的模型的外键设置为 null。这种操作会改变数据库的数据结构,但不会删除与之关联的模型实例。

4. "SET_DEFAULT":这个策略是用来将外键设置为默认值。当一个模型被删除时,Django 会自动将与之关联的模型的外键设置为默认值。这种操作会改变数据库的数据结构,但不会删除与之关联的模型实例。

在实际应用中,你需要根据具体的情况选择合适的删除策略。例如,如果你需要保护一对多关系,可以使用 "PROTECT" 策略;如果你需要级联删除,可以使用 "CASCADE" 策略;如果你需要将外键设置为 null,可以使用 "SET_NULL" 策略;如果你需要将外键设置为默认值,可以使用 "SET_DEFAULT" 策略。

    '''
    # 外键,collection:collector = N:1
    collector = models.ForeignKey(Collector, on_delete=models.PROTECT, verbose_name='收藏单位', default='张仁')
    kiln = models.ForeignKey(Kiln, on_delete=models.PROTECT, verbose_name='所属文化/窑口')
    # 多对多关系,collection:character=N:N
    dynasty = models.ManyToManyField(Dynasty, verbose_name='年代')
    character = models.ManyToManyField(Character, verbose_name='质地')
  • 6
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值