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


    ORM事务操作

    引入事务

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

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

    开启事务

    from django.db import transaction
        try:
            with transaction.atomic():
                # SQL1
                # SQL2
                # SQL3
                """写在同一个with语句的代码块都是属于同一个事务,要么同时成功,要么同时失败"""
        except Exception as e:
            print(e)  # 记录日志
            transaction.rollback()
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    常见的字段类型和参数

    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='')             虚拟外键字段,建立多对多关系
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

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

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    ORM常用字段参数

    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()  # 通过这个方法拿显示转义后的选项
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    外键相关参数

    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:主表一般是指在一对一、一对多中一的那一方,当对其进行删除时,另外一张表的所有元素都应该受到影响
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
  • 相关阅读:
    docker部署redis/mongodb/
    【C++庖丁解牛】vector容器的简易模拟实现(C++实现)(最后附源码)
    【pyqt5界面化工具开发-14】初始牛刀-登录工具
    微头条项目实战:新增RequestHeader注解
    openresty安装配置,执行shell脚本
    【Go语言精进之路】构建高效Go程序:掌握变量、常量声明法则与iota在枚举中的奥秘
    ConcurrentHashMap
    shell脚本按日期范围和间隔下载数据
    C++中->与.的区别
    02 DevOps 之 Jenkins
  • 原文地址:https://blog.csdn.net/shiyaopeng11/article/details/134482703