Django之模型层——ORM事务操作、ORM常用字段及参数

复习:

1.事务的四大特性(ACID)
原子性、一致性、隔离性、持久性
2.相关SQL关键字

  • start transaction;
  • rollback;
  • commit;
  • savepoint;

3.相关重要概念
  脏读、幻读、不可重复读、MVCC多版本控制...

Django ORM事务操作

django orm提供了至少三种开启事务的方式

方式1.全局开启

在Web应用中,常用的事务处理方式是将每个请求都包裹在一个事务中。这个功能使用起来非常简单,你只需要将它的配置项ATOMIC_REQUESTS设置为True

它是这样工作的:当有请求过来时,Django会在调用视图方法前开启一个事务。如果请求却正确处理并正确返回了结果,Django就会提交该事务。否则,Django会回滚该事务。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'mxshop',
        'HOST': '127.0.0.1',
        'PORT': '3306',
        'USER': 'root',
        'PASSWORD': '123',
     "ATOMIC_REQUESTS": True, #全局开启事务,绑定的是http请求响应整个过程 "AUTOCOMMIT":False, #全局取消自动提交,慎用 },   'other':{     'ENGINE': 'django.db.backends.mysql', ......   } # 还可以配置其他数据

 

方式2: 局部使用事务(装饰器)

@transaction.atomic  加了该装饰器的视图函数默认属于一个事务

from django.db import transaction

@transaction.atomic
def index():
  # 下面的代码在一个事务中执行,一但出现异常,整个函数中所有的数据库操作全部都会回滚

方式3: with上下文管理

with transaction.atomic():

会将with里面的ORM语句作为一个事务

from django.db import transaction

def reg(request):
    with transaction.atomic():

      # 下面的代码在一个事务中执行,一但出现异常,整个with函数内部的数据库操作都会回滚
      ...

ORM常用字段类型

字段 功能
AutoField() int类型且自增,必须填入参数 primary_key=True
CharField() 主要存储字符串的数据类型
IntegerField() 存储整型数据
BigIntegerField() 大整型,只要用于存储整型的数据
DateField() 主要存储日期类型的数据类型,年月日
DateTimeField() 主要存储日期类型的数据类型,时分秒
DecimalField() 表示固定精度的十进制数的字段。它有两个必须的参数:max_digits:数字允许的最大位数decimal_places:小数的最大位数
EmailField() 邮件格式的数据
BooleanField() 传布尔值存数字0或1
TextField() 存储大段文本
FileField() 存储文件数据 自动找指定位置存储 字段存具体路径
ForeignKey() 外键字段
OneToOneField() 一对一外键字段
ManyToManyField() 多对多外键字段

自定义字段

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

Django中的CharField对应的MySQL数据库中的varchar类型,没有设置对应char类型的字段,但是Django允许我们自定义新的字段,下面我来自定义对应于数据库的char类型。

 

 自定义字段在实际项目应用中可能会经常用到,这里需要对他留个印象!

示例:

from django.db import models

# Create your models here.
#Django中没有对应的char类型字段,但是我们可以自己创建
class FixCharField(models.Field):
    '''
    自定义的char类型的字段类
    '''
    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):
        '''
        限定生成的数据库表字段类型char,长度为max_length指定的值
        :param connection:
        :return:
        '''
        return 'char(%s)'%self.max_length
#应用上面自定义的char类型
class Class(models.Model):
    id=models.AutoField(primary_key=True)
    title=models.CharField(max_length=32)
    class_name=FixCharField(max_length=16)
    gender_choice=((1,''),(2,''),(3,'保密'))
    gender=models.SmallIntegerField(choices=gender_choice,default=3)

ORM常用字段参数

字段参数 说明
max_length CharField必须要设置该参数,不然会报错
verboses_name 相当于注释
auto_now 修改一次就重新记录一次此次修改的事件
auto_now_add 只有创建的时候记录,以后不会改变
null 用于表示某个字段可以为空。设置方式:null = True
default 为该字段的默认值,设置方式:default = ‘默认值’
max_digits 数字允许的最大位数
decimal_places 小数的最大位数
unique=True 用于表示该字段值在此表中必须是唯一的,建立唯一索引,设置方式:unique = True
db_index=True 将该字段设置为索引,设置方式:db_index = True
to 绑定外键字段对应的表
to_field 指定想要绑定的外键字段
related_name 给外键字段起别名

choices

当字段数据的可能性可以完全列举出来的时候,应该考虑使用该参数

class User(models.Model):
    name = models.CharField(max_length=32)
    info = MyCharField(max_length=64)
    # 提前列举好对应关系
    gender_choice = (
        (1, '男性'),
        (2, '女性'),
        (3, '其他'),
    )
    gender = models.IntegerField(choices=gender_choice, null=True)


user_obj = User.objects.filter(pk=1).first()
user_obj.get_gender_display()

 

on_delete

参数 功能
models.CASCADE 级联操作,当主表中被连接的一条数据删除时,从表中所有与之关联的数据同时被删除
models.SET_NULL 当主表中的一行数据删除时,从表中所有与之关联的数据的相关字段设置为null,此时注意定义外键时,这个字段必须可以允许为空
models.PROTECT 当主表中的一行数据删除时,由于从表中相关字段是受保护的外键,所以都不允许删除
models.SET_DEFAULT 当主表中的一行数据删除时,从表中所有相关的数据的关联字段设置为默认值,此时注意定义外键时,这个外键字段应该有一个默认值
models.SET() 当主表中的一条数据删除时,从表中所有的关联数据字段设置为SET()中设置的值,与models.SET_DEFAULT相似,只不过此时从表中的相关字段不需要设置default参数
models.DO_NOTHING 什么都不做,一切都看数据库级别的约束,注数据库级别的默认约束为RESTRICT,这个约束与django中的models.PROTECT相似
posted @ 2022-12-19 18:39  莫~慌  阅读(420)  评论(0编辑  收藏  举报