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 分钟前
如何安装python以及jupyter notebook
开发语言·python·jupyter
TDengine (老段)14 分钟前
TDengine 数据库建模最佳实践
大数据·数据库·物联网·时序数据库·tdengine·涛思数据
Elastic 中国社区官方博客24 分钟前
Elasticsearch 字符串包含子字符串:高级查询技巧
大数据·数据库·elasticsearch·搜索引擎·全文检索·lucene
Gauss松鼠会1 小时前
GaussDB应用场景全景解析:从金融核心到物联网的分布式数据库实践
数据库·分布式·物联网·金融·database·gaussdb
守城小轩1 小时前
Chromium 136 编译指南 - Android 篇:开发工具安装(三)
android·数据库·redis
尽兴-1 小时前
如何将多个.sql文件合并成一个:Windows和Linux/Mac详细指南
linux·数据库·windows·sql·macos
Deng9452013141 小时前
基于Python的旅游数据可视化应用
python·numpy·pandas·旅游·数据可视化技术
2401_878624791 小时前
pytorch 自动微分
人工智能·pytorch·python·机器学习
胖达不服输1 小时前
「日拱一码」021 机器学习——特征工程
人工智能·python·机器学习·特征工程
小小不董2 小时前
深入理解oracle ADG和RAC
linux·服务器·数据库·oracle·dba