Django(八、如何开启事务、介绍长见的字段类型和参数)

文章目录

ORM事务操作

引入事务

python 复制代码
1.事务的四大特性
	原子性、一致性、隔离性、持久性
2.相关SQL关键字
	start transaction;
	rollback;
	commit;
	savapoint;
3.相关重要概念
	脏读、幻读、不可重复读、MVCC多版本控制

Django ORM提供了至少三种开启事务的方式

开启事务

python 复制代码
from django.db import transaction
    try:
        with transaction.atomic():
            # SQL1
            # SQL2
            # SQL3
            """写在同一个with语句的代码块都是属于同一个事务,要么同时成功,要么同时失败"""
    except Exception as e:
        print(e)  # 记录日志
        transaction.rollback()

常见的字段类型和参数

python 复制代码
1.AutoField(primary_key)  # 字段才用,可以让它自动创建
2.CharField(max_length)   # 对应varchar字段,存储有限的字符
3.IntegerField            # 整型
4.BigIntergerField        #整型(比如手机号11位)
5.DecimalField(max_digits,decimal_places)   # 小数字段
6.DateField(auto_now,aoto_now_add)    # 日期(年月日)
7.DateTimeField(auto_now auto_now_add)  #日期(年月日时分秒)
8.Booleanfiels:传布尔值自动存0(False)或者1(True)   
9.TextField:存储大段文本
10.EmailField:存储邮箱格式数据
11.FileField:传文件对象,自动保存到提前配置好的路径下并存储该路径信息
12.ForeignKeyField(to='',on_delete)  实际外键字段,建立一对一关系
13.OneToOneField(to='',on_delete)    实际外键字段,建立一对多关系
14.ManyToManyField(to='')             虚拟外键字段,建立多对多关系

需要说明的是,这些orm字段并非和sql字段一一对应,有些是封装了一些逻辑功能在字段的创建、存储过程中的。

ORM还支持用户自定义字段类型

python 复制代码
class MyCharField(models.Field):
     def __init__(self,max_length,*args,**kwargs):
         self.max_length=max_length
         super().__init__(max_length=max_length,*args,**kwargs)
     def db_type(self,connection):
        return 'char(%s)' % self.max_length
        
class User(models.Model):
    name=models.CharField(max_length=32)
    info=MyCharField(max_length=64)

ORM常用字段参数

python 复制代码
1.primary_key      主键字段
2.verbose_name     字段注释
3.max_length       字段长度
4.max_digits       小数总共多少位
5.decimal_places   小数点后面的位数
6.auto_now         每次操作数据自动更新事件
7.auto_now_add     首次创建自动更新事件后续不自动更新
在时间相关字段的独有参数,设置为True则会自动执行相关功能。
8.null             允许字段为空
9.default          字段默认值
10.unique           唯一值
11.db_index         给字段添加索引
12.choices          当某个字段的可能性能够被列举完全的情况下使用
13.to/to_field/on_delete 
eg:性别、学历、工作状态...
    class User(models.Model):
        name=models.CharField(max_length=32)
        info= MyCharField(max_length=64)
        # 提前列举好对应关系
        gender_choice=(
        	(1,'男性'),
            (2,'女性'),
            (3,'其他'),
        )
        gender = models.IntergerField(choices=gender_choice,null=True)
        user_obj = User.objects.filter(pk=1).first()  # 拿到一个对象
        user_obj.gender  # 直接点显示存储的真实数据
        user_obj.get_gender_display()  # 通过这个方法拿显示转义后的选项

外键相关参数

python 复制代码
to				关联表
to_field		关联字段(不写默认关联数据主键)
on_delete		当删除关联表中的数据时,当前表与其关联的行的行为。(只针对一对多和一对一关系)

on_delete()里面相关参数
1、models.CASCADE
    级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
2、models.SET_NULL
    当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
3、models.PROTECT
    当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
4、models.SET_DEFAULT
    当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
5、models.SET()
    当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
6、models.DO_NOTHING
    什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似
ps:主表一般是指在一对一、一对多中一的那一方,当对其进行删除时,另外一张表的所有元素都应该受到影响
相关推荐
小白学大数据9 分钟前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫
Python大数据分析@13 分钟前
python操作CSV和excel,如何来做?
开发语言·python·excel
黑叶白树14 分钟前
简单的签到程序 python笔记
笔记·python
Shy96041827 分钟前
Bert完形填空
python·深度学习·bert
time never ceases30 分钟前
使用docker方式进行Oracle数据库的物理迁移(helowin/oracle_11g)
数据库·docker·oracle
Frank牛蛙34 分钟前
1.每日SQL----2024/11/7
数据库·sql
Ciderw36 分钟前
块存储、文件存储和对象存储详细介绍
网络·数据库·nvme·对象存储·存储·块存储·文件存储
薛晓刚37 分钟前
数据库优化指南:如何将基本功能运用到极致?
数据库
上海_彭彭38 分钟前
【提效工具开发】Python功能模块执行和 SQL 执行 需求整理
开发语言·python·sql·测试工具·element
stars_User40 分钟前
MySQL数据库面试题(下)
数据库·mysql