删除多对多表关系 :
# 删除子表与母表关联关系,让小虎不喜欢任何颜色
# 写法1:
child_obj = Child.objects.get(name="apollo")
colors_obj = Colors.objects.all()
child_obj.favor=''
child_obj.save()
# 写法2:
child_obj = Child.objects.get(name="apollo")
colors_obj = Colors.objects.all()
child_obj.favor.remove(*colors_obj)
# 写法3:
child_obj = Child.objects.get(name="apollo")
child_obj.favor.clear()
# 删除母表与子表关联关系,让所有人不再喜欢蓝色
# 写法1:
children_obj = Child.objects.all()
colors_obj = Colors.objects.get(colors="蓝")
colors_obj.child_set.remove(*children_obj)
拆包变成了反向删除??
# 写法2:
colors_obj = Colors.objects.get(colors="蓝")
colors_obj.child_set.clear()
#删除子表数据,喜欢蓝色的所有人都删掉
colors_obj = Colors.objects.get(colors="蓝")
colors_obj.child_set.all().delete() #注意有.all()
#删除所有child
Child.objects.all().delete()
删除母表数据:
默认情况下,如此例中,删除红色,那么子表与颜色表是一对一或外键关系的,子表对应数据会自动删除,
如:红球,apollo与颜色表是多对多关系的话,不会自动删除喜欢红色的人,而是去掉红色已选.
如果想让与母表外键关联的子表在删除外键之后依旧可以保留子表数据,需要子表建表时加入以下字段:
class Clothes(models.Model):
color=ForeignKey("Colors",null=True,on_delete=models.SET_NULL))
#可为空,如果外键被删后,子表数据此字段置空而不是直接删除这条数据,同理也可以SET_DEFAULT,需要此字段有默认值
也可以加PROTECT =====》on_delete=models.PROTECT
再来一个身份证对应驾照的例子
class IDCard(models.Model):
id_num = models.CharField(max_length=32,unique=True)
id_name = models.CharField(max_length=32)
class DriverCard(models.Model):
diver_leverl = models.CharField(max_length=16)
driver_idcard = models.OneToOneField(IDCard,on_delete=models.PROTECT)
转载:https://blog.csdn.net/qq_41856814/article/details/102490625