概要
最近学习django框架,遇到数据库模型的删除策略问题的小细节,在csdn上搜不太到有关资料,故叙述如下:
技术名词解释
`
Django 的删除策略分为几个级别,分别对应不同的应用场景:
-
“PROTECT”(默认值):这个策略是用来保护多个模型之间的一对多关系。当一个外键关联的模型被删除时,Django 会自动保护与之相关的模型实例不被删除。这种保护是基于数据库的,所以在数据库层面上,相关的模型实例不会被删除。
-
“CASCADE”:这个策略是用来级联删除。当一个模型被删除时,Django 会自动删除与其关联的模型实例。这种删除是级联的,它会递归地删除所有与该模型相关的记录。
-
“SET_NULL”:这个策略是用来将外键设置为 null。当一个模型被删除时,Django 会自动将与之关联的模型的外键设置为 null。这种操作会改变数据库的数据结构,但不会删除与之关联的模型实例。
-
“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='质地')