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:主表一般是指在一对一、一对多中一的那一方,当对其进行删除时,另外一张表的所有元素都应该受到影响
相关推荐
sun0077006 分钟前
mysql索引底层原理
数据库·mysql
chao_7893 小时前
二分查找篇——搜索旋转排序数组【LeetCode】一次二分查找
数据结构·python·算法·leetcode·二分查找
烛阴3 小时前
Python装饰器解除:如何让被装饰的函数重获自由?
前端·python
workflower3 小时前
MDSE和敏捷开发相互矛盾之处:方法论本质的冲突
数据库·软件工程·敏捷流程·极限编程
Tony小周3 小时前
实现一个点击输入框可以弹出的数字软键盘控件 qt 5.12
开发语言·数据库·qt
noravinsc3 小时前
django 一个表中包括id和parentid,如何通过parentid找到全部父爷id
python·django·sqlite
lifallen3 小时前
Paimon 原子提交实现
java·大数据·数据结构·数据库·后端·算法
ajassi20003 小时前
开源 python 应用 开发(三)python语法介绍
linux·python·开源·自动化
沉默媛4 小时前
如何安装python以及jupyter notebook
开发语言·python·jupyter
TDengine (老段)4 小时前
TDengine 数据库建模最佳实践
大数据·数据库·物联网·时序数据库·tdengine·涛思数据