Django数据模型中on_delete使用详解
on_delete属性针对外键ForeignKey
一、django3.0官方文档介绍:
Many-to-onerelationships多对一关系
Todefineamany-to-onerelationship,usedjango.db.models.ForeignKey.YouuseitjustlikeanyotherFieldtype:byincludingitasaclassattributeofyourmodel.
ForeignKeyrequiresapositionalargument:theclasstowhichthemodelisrelated.
Forexample,ifaCarmodelhasaManufacturer–thatis,aManufacturermakesmultiplecarsbuteachCaronlyhasoneManufacturer–usethefollowingdefinitions:
fromdjango.dbimportmodels classManufacturer(models.Model): #... pass classCar(models.Model): manufacturer=models.ForeignKey(Manufacturer,on_delete=models.CASCADE) #...
Youcanalsocreaterecursiverelationships(anobjectwithamany-to-onerelationshiptoitself)andrelationshipstomodelsnotyetdefined;seethemodelfieldreferencefordetails.
It'ssuggested,butnotrequired,thatthenameofaForeignKeyfield(manufacturerintheexampleabove)bethenameofthemodel,lowercase.Youcan,ofcourse,callthefieldwhateveryouwant.
常见的使用方式(设置为null)
classApiList(models.Model): desc=models.CharField(max_length=255,verbose_name="接口描述") keyword=models.CharField(max_length=100,verbose_name="请求关键字") response=models.TextField(verbose_name="响应结果") api=models.ForeignKey(Api,blank=True,null=True,on_delete=models.SET_NULL,verbose_name="所属接口") status=models.IntegerField(default=1,verbose_name="状态") create_at=models.CharField(max_length=20,verbose_name="创建时间") update_at=models.CharField(max_length=20,verbose_name="更新时间")
一对多(ForeignKey)
classForeignKey(ForeignObject): def__init__(self,to,on_delete,related_name=None,related_query_name=None, limit_choices_to=None,parent_link=False,to_field=None, db_constraint=True,**kwargs): super().__init__(to,on_delete,from_fields=['self'],to_fields=[to_field],**kwargs)
一对一(OneToOneField)
classOneToOneField(ForeignKey): def__init__(self,to,on_delete,to_field=None,**kwargs): kwargs['unique']=True super().__init__(to,on_delete,to_field=to_field,**kwargs)
从上面外键(ForeignKey)和一对一(OneToOneField)的参数中可以看出,都有on_delete参数,而django升级到2.0之后,表与表之间关联的时候,必须要写on_delete参数,否则会报异常:
TypeError:__init__()missing1requiredpositionalargument:'on_delete'
因此,整理一下on_delete参数的各个值的含义:
on_delete=None,#删除关联表中的数据时,当前表与其关联的field的行为 on_delete=models.CASCADE,#删除关联数据,与之关联也删除 on_delete=models.DO_NOTHING,#删除关联数据,什么也不做 on_delete=models.PROTECT,#删除关联数据,引发错误ProtectedError #models.ForeignKey('关联表',on_delete=models.SET_NULL,blank=True,null=True) on_delete=models.SET_NULL,#删除关联数据,与之关联的值设置为null(前提FK字段需要设置为可空,一对一同理) #models.ForeignKey('关联表',on_delete=models.SET_DEFAULT,default='默认值') on_delete=models.SET_DEFAULT,#删除关联数据,与之关联的值设置为默认值(前提FK字段需要设置默认值,一对一同理) on_delete=models.SET,#删除关联数据, a.与之关联的值设置为指定值,设置:models.SET(值) b.与之关联的值设置为可执行对象的返回值,设置:models.SET(可执行对象)
多对多(ManyToManyField)
classManyToManyField(RelatedField): def__init__(self,to,related_name=None,related_query_name=None, limit_choices_to=None,symmetrical=None,through=None, through_fields=None,db_constraint=True,db_table=None, swappable=True,**kwargs): super().__init__(**kwargs)
因为多对多(ManyToManyField)没有on_delete参数,所以略过不提.
二、on_delete外键删除方式
- CASCADE:级联删除。当Manufacturer对象删除时,它对应的Car对象也会删除。
- PROTECT:保护模式,采用该选项,删除时会抛出ProtectedError错误。
- SET_NULL:置空模式,删除的时候,外键字段被设置为空,前提就是blank=True,null=True,定义该字段的时候,允许为空。当Manufacturer对象删除时,它对应的Car对象的manufacturer字段会置空,前提是null=True
- SET_DEFAULT:置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
- SET():自定义一个值,该值当然只能是对应的实体了
django3.0关于models官方文档地址:
1.https://docs.djangoproject.com/en/3.0/topics/db/models/
2.https://docs.djangoproject.com/en/3.0/ref/models/fields/#django.db.models.ForeignKey
到此这篇关于Django数据模型中on_delete使用详解的文章就介绍到这了,更多相关Djangoon_delete使用内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!