当前位置: 代码迷 >> 综合 >> djnago---外键的一些操作
  详细解决方案

djnago---外键的一些操作

热度:6   发布时间:2023-11-23 18:57:53.0

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']} 一个列表,那在前端中只能选择这个列表中的数据