orm—设置多表关系-级联与关联
1、设置关联表关系
db_constraint=False
1、不会影响连表查询操作效率
2、会提升连表增删改操作效率
3、易于后期数据库表的重构
4、缺点:数据库本身没有连表检测,容易出现脏数据,需要通过严格的逻辑避免脏数据的产生
2、设置级联关系
当表之间有外键关系,若是设置了级联删除,那么被依赖的表数据被删除是,数据库将会报错
若是设置为不级联,就不会报错,依赖这条数据的表数据,将会根据外键的级联设置变更状态,如下:
需要注意的是,使用orm的delete方法删除数据,就算外键设置为级联,同样可以删除,不会报错
related_name # 在外键中设置外键反向查询的字段名,正向找字段名,反向找related_name
on_delete=models.CASCADE # 级联 ,多对多关系不能设置级联关系,默认为级联
on_delete=models.DO_NOTHING # 不级联,将会产生脏数据,即没有意义的数据
on_delete=models.SET_DEFAULT, default=1 # 删除之后,依赖这条数据的表数据对应的字段设置为default
on_delete=models.SET_NULL, null=True # 删除之后,依赖这条数据的表数据对应的字段设置为空,即未设置状态,不是脏数据
from django.db import models
class Book(BaseModel):
name = models.CharField(max_length=64,null=True)
price = models.DecimalField(max_digits=6, decimal_places=2,null=True)
publish = models.ForeignKey(to='Publish', related_name='books', on_delete=models.SET_DEFAULT, default=1,
db_constraint=False)
author = models.ManyToManyField(to='Author', related_name='books', db_constraint=False)
def __str__(self):
return self.name
class Publish(BaseModel):
name = models.CharField(max_length=64,null=True)
address = models.CharField(max_length=64,null=True)
def __str__(self):
return self.name
class Author(BaseModel):
name = models.CharField(max_length=64,null=True)
def __str__(self):
return self.name
class AuthorDetail(models.Model):
mobile = models.CharField(max_length=64)
author = models.OneToOneField(to=Author, related_name="detail", db_constraint=True)
def __str__(self):
return f'{self.author.name}-detail'

浙公网安备 33010602011771号