1. 级联关系
0. 多对多没有on_delete
1、表之间没有外键关联,但是有外键逻辑关联(有充当外键的字段)
2、断关联后不会影响数据库查询效率,但是会极大提高数据库增删改效率(不影响增删改查操作)
3、断关联一定要通过逻辑保证表之间数据的安全,不要出现脏数据,代码控制
4、断关联
5、级联关系
作者没了,详情也没:on_delete=models.CASCADE
出版社没了,书还是那个出版社出版:on_delete=models.DO_NOTHING
部门没了,员工没有部门(空不能):null=True, on_delete=models.SET_NULL
部门没了,员工进入默认部门(默认值):default=0, on_delete=models.SET_DEFAULT
3. 做抽象表(不生成该表,一般做基表)
from django.db import models
class BaseModel(models.Model):
is_show = models.BooleanField(verbose_name='展示', default=True)
is_delete = models.BooleanField(verbose_name='删除', default=False)
create_time = models.DateTimeField(verbose_name='创建时间', auto_now_add=True)
update_time = models.DateTimeField(verbose_name='更新时间', auto_now=True)
order = models.SmallIntegerField(verbose_name='排序', default=1)
class Meta:
# 抽象表
abstract = True
4. 外键可以为空
teacher = models.ForeignKey("Teacher", on_delete=models.DO_NOTHING, null=True, blank=True, verbose_name="授课老师")
6. db_contraint=False(仅仅逻辑关联),作用在外键上
6.1 介绍
1. 仅仅只是逻辑上的关联,没有真实的关联了
2.与null=True, blank=True,on_delete=models.SET_NUL连用才生效
3. 多对多无法使用
4. db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一般公司都用false,这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)
6.2 代码
class Book(models.Model):
"""书籍表"""
name = models.CharField('名称', max_length=50)
price = models.IntegerField('价格', default=50)
publisher = models.ForeignKey('Publisher', on_delete=models.CASCADE, db_contraint=False)
class Meta:
db_table = 'books_book'
class Publisher(models.Model):
"""出版社表"""
name = models.CharField('出版社名称', max_length=50)
addr = models.CharField('出版社地址', max_length=50)
class Meta:
db_table = 'books_publisher'
7. limit_choices_to
7.1 介绍
限制关联字段的对象范围
7.2 代码示例
class ClassList(models.Model):
"""
班级表
"""
school = models.ForeignKey(verbose_name='校区', to='School', on_delete=models.CASCADE)
class_teacher = models.ForeignKey(verbose_name='班主任', to='UserInfo', related_name='classes',
on_delete=models.CASCADE, limit_choices_to={'depart__title': '教质部'})
tech_teachers = models.ManyToManyField(verbose_name='任课老师', to='UserInfo', related_name='teach_classes',
limit_choices_to={'depart__title__in': ['Python教学部', 'Linux教学部']})
memo = models.TextField(verbose_name='说明', null=True, blank=True)
从上面的model字段可以看出, class_teacher字段限制了选择条件:{'depart__title': '教质部'}, 即在选择班主任的时候,只能选择关联班主任的外键表depart中名称为教质部的数据
ManyToMany字段的limit_choices_to指向了 {'depart__title__in':['xx','xx']} 一个列表,那在前端中只能选择这个列表中的数据