首页 > 其他分享 >django数据模型中关于on_delete,db_constraint的参数说明

django数据模型中关于on_delete,db_constraint的参数说明

时间:2022-10-08 10:57:55浏览次数:61  
标签:SET name constraint models db True 数据模型

django数据模型中关于on_delete,db_constraint的参数说明

1.设置为null

class BookModel(models.Model):
    """
    图书
    """
    book_name = models.CharField(max_length=100, verbose_name='书名')
    # 表示外键关联到作者表,当作者表删除了该条数据,图书表中不删除,仅仅是把外键置空
    author = models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL)
    price = models.FloatField(verbose_name='价格')
    create_time = models.DateTimeField(auto_now_add=True, verbose_name='添加时间')

2.建表时其他参数的设置

CASCADE:这就是默认的选项,级联删除,你无需显性指定它。
PROTECT: 保护模式,如果采用该选项,删除的时候,会抛出ProtectedError错误。
SET_NULL: 置空模式,删除的时候,外键字段被设置为空,前提就是blank=True, null=True,定义该字段的时候,允许为空。
SET_DEFAULT: 置默认值,删除的时候,外键字段设置为默认值,所以定义外键的时候注意加上一个默认值。
SET(): 自定义一个值,该值当然只能是对应的实体了

3.set的使用

def get_sentinel_user():
    return get_user_model().objects.get_or_create(username='deleted')[0]

class MyModel(models.Model):
    user = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET(get_sentinel_user),
    )

4.ManyToMany参数(through,db_constraint)

class Book(models.Model):
    name=models.CharField(max_length=20)
    authors=models.ManyToMany('Author',through='Score')


class Author(models.Model):
    name=models.CharField(max_length=20)


class Score(models.Model):
    book=models.ForeignKey('Book')
    author=models.ForeignKey('Author')
    socre=models.IntegerField()
    
#######
如果只写manytomany,那么第三张是Django替我们建的,可以通过book.authors字段进行一系列操作(add(增),all(查),set(重置),remove(删除)),但是此时没法给第三张表加其他我们需要的字段,

而如果不写,ManyToMany字段,那么我们可以通过Score来执行一些操作,但是此时book和author表已经没有直接的联系了,查询起来很繁琐

有了authors=models.ManyToMany('Author',through='Score'),那么就既可以方便查,也方便业务,添加需要的字段

5.db_constraint

db_constraint=False,这个就是保留跨表查询的便利(双下划线跨表查询```),但是不用约束字段了,一半公司都用false,这样就省的报错,因为没有了约束(Field字段对象,既约束,又建立表与表之间的关系)

limit_choices_to
限制关联字段的对象范围

related_name
反向查询字段可以不用 表名小写,可以改名了

db_table
第三张表的名字


 models.ForeignKey(AuthModel, null=True, blank=True, on_delete=models.SET_NULL,db_constraint=False)

总结

如果使用两个表之间存在关联,首先db_constraint=False 把关联切断,但保留链表查询的功能,其次要设置null=True, blank=True,注意on_delete=models.SET_NULL 一定要置空,这样删了不会影响其他关联的表

标签:SET,name,constraint,models,db,True,数据模型
From: https://www.cnblogs.com/chunyouqudongwuyuan/p/16768268.html

相关文章

  • ADB命令&adb命令卸载手机软件
    adb进入adb目录cdC:\ProgramFiles(x86)\platform-tools_r31.0.2-windows\platform-tools#我的笔记本进入adb目录cdC:\ProgramFiles(x86)\adb-tools#我的台式......
  • dg环境下修改redo log和standby log
    系统:centos7.964位数据库:oracle11.2.0.464位环境:rac(双节点)+dg问题描述:搭建dg处理联机&standby日志文件的log_file_name_convert参数时,由于少添加“/”,造成联机日志......
  • CentOS 7.9 安装 mongodb5.0.13
    一、CentOS7.9安装mongodb5.0.131 下载地址:https://www.mongodb.com/try/download/community2  2 安装前的准备 #操作系统内核版本uname-a#操作系统......
  • dg端drop standby log报错ORA-00261 ORA-00312
    系统:centos7.964位数据库:oracle11.2.0.464位环境:rac(双节点)+dg问题描述:dg端dropstandbylog报错ORA-00261、ORA-00312,如下所示:SQL>selecta.thread#,a.group#,b.me......
  • jdbc连接
    准备1.在java项目下面创建空文件夹lib,把jdbc放到lib文件夹里2.对jar包右键选择buildpath->addtopath3.在新出现的referenceslibraries下选择第一个(com.mysql.jdbc......
  • Mysql之Innodb锁场景
    mysql锁分类基于锁的属性分类:共享锁(读锁)、排他锁(写锁)基于锁的粒度分类:行级锁(innodb)、表锁(innodb、myisam)、页级锁(innodb引擎)、记录锁、间隙锁、临建锁。mys......
  • odbc 驱动开发的一些资料
    dremio以前版本的odbc当前是已经不支持直接下载了,早期版本的odbc是基于了drill的odbc驱动,利用了SimbaEnginesdk以下是整理的一些资料可以参考如何开发odbcdriver,mag......
  • 【VFP】如何将超大数据的EXCEL表转换为DBF表
    经常进行计算机处理的工作人员,有时候需要用VFP来快速处理EXCEL电子表格里数据。如果EXCEL数据少的话,可以直接打开数据表,将文件另存为”EXCEL5.0/95",然后在VFP里从文件菜单......
  • Mongodb学习实践文档
    2020年12月目 录1MongoDB简介12Mongodb与传统关系型数据库对比13Mongodb基础运维23.1Mongodb安装33.1.1创建用户33.1.2创建目录33.1.3安装33.1.4mongod......
  • JDBC
    1.JDBC  API提供了Java应用程序与各种不同数据库交互的标准接口,如:Connection(连接)接口,Statement接口,ResultSet(结果集)接口,PreparedStatement接口等。开发者使用这些JDB......