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'
posted @ 2019-12-26 17:21  W文敏W  阅读(386)  评论(0)    收藏  举报