首页 > 其他分享 >Django之模型层ORM事务操作、ORM常用字段及参数

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

时间:2022-12-19 18:44:39浏览次数:51  
标签:models max 外键 Django length ORM 常用字 True

复习:

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相似

 

标签:models,max,外键,Django,length,ORM,常用字,True
From: https://www.cnblogs.com/chen-ao666/p/16992841.html

相关文章

  • WaitForSingleObject与WaitForMultipleObjects用法详解
    在多线程下面,有时候会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用WindowsAPI函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待......
  • formly-form 动态表单
    动态表单库https://github.com/ngx-formly/ngx-formly安装ngadd@ngx-formly/schematics--ui-theme=ng-zorro-antd@ngx-formly/ng-zorro-antd选择UIbootstr......
  • EBS挂载FORM详细步骤
    上传fmb文件编译到指定目录,具体编译到哪里,可以在applicationdeveloper职责下的应用产品->注册查看F11搜索,搜索%SECOM%,记下基本路径,下一步会用到3编译登录服务器,进......
  • Q查询进阶 ORM查询优化 ORM事物操作 ORM常用字段及字段参数 Ajax请求
    目录Q查询进阶操作ORM查询优化1.ORM的查询默认都是惰性查询2.ORM的查询自带分页处理3.only与deferonlydefer4.select_related与prefetch_relatedselect_related连表查询pr......
  • django简易图书管理系统
    图书管理系统项目前期准备在pycharm中创建新项目配置默认设置文件创建db1216库配置默认设置文件表结构设计图书表(书名(CharField),图书价格(DesimalField),图......
  • django-Ajax
    Ajaxajax不是一门新的技术并且有很多版本我们目前的是jQuery版本(版本无所谓本质一样就可以)Ajax的特点:异步提交,局部刷新基本语法: $.ajax({url:'',//后......
  • 【Django之Django REST Framework框架安装+Django之ORM框架】
    【Django之DjangoRESTFramework框架安装】一、简介它是在Django基础之上,进行了二次开发主要用于构建RestfulAPI简称为DRF框架或者RESTFramework框架二、特性提供了强大......
  • 问题解决系列:NameError: name 'platform_system' is not defined
    问题场景使用 ​​pip​​​安装依赖的时候,更新之后,更新的依赖不能用。比如我将机器的​​ansible​​​版本指定安装​​2.7.11​​​版本,安装成功之后,使用命令​​ansible......
  • django Q查询、orm查询优化、事务、常用字段、三种多对多,Ajax
    目录今日内容详细Q查询进阶操作ORM查询优化ORM事务操作ORM常用字段类型ORM常用字段参数AjaxContent-Typeajax携带文件数据今日内容详细Q查询进阶操作fromdjango.db.mod......
  • ReactNative(三)——WebStorm的基本配置
    设置.js文件默认以jsx的语法打开在没有进行设置的情况下,每次打开WebStorm的时候打开包含jsx语法的.js文件都会有以下提示:当然我们点击转换后就可以了,但是每次都会提示,所以还......