刪除多對多表關系 :
# 刪除子表與母表關聯關系,讓小虎不喜歡任何顏色
# 寫法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)
??