djnago---外键的一些操作

本文探讨了级联关系、逻辑关联的重要性,如何处理多对多、断开关联的场景,以及抽象表的使用。还涉及外键的空值处理、db_constraint=False的应用,以及limit_choices_to的限制策略。
摘要由CSDN通过智能技术生成

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑猪去兜风z1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值