首页 > 其他分享 >ORM查询优化、ORM字段类型及参数、ORM事务操作

ORM查询优化、ORM字段类型及参数、ORM事务操作

时间:2022-12-19 21:24:01浏览次数:39  
标签:obj models res 查询 字段 ORM max

  • ORM查询优化(重点)

  • ORM事务操作

  • ORM常用字段类型

  • ORM常用字段参数

  • ORM三种创建多对多的方式

ORM查询优化(重点)

1.ORM查询默认都是惰性查询 
'''获取的是数据对象'''
res = models.Book.objects.all() # 只写这一句不走数据库查询
print(res) # 得到列表套对象 queryset[数据对象、数据对象]

image

2.ORM的查询自带分页处理

image

3.only与defer
# only
'''数据对象+含有指定字段对应的数据'''
res = models.Book.objects.only('title', 'price')
    # print(res)  # queryset [数据对象、数据对象]
for obj in res:
    print(obj.title)  # 查询括号内填写的字段 不走SQL查询
    print(obj.price)
    
    print(obj.publish_time) # 也可以点括号内没有的字段获取数据 但是会走SQL查询

image

image

# defer
res = models.Book.objects.defer('title', 'price')
    # print(res)  # queryset [数据对象、数据对象]
for obj in res:
    print(obj.title)  # 点击括号内填写的字段 走SQL查询
    print(obj.price)
    
    print(obj.publish_time)  # 点击括号内没有的字段获取数据 不走SQL查询

image

image

4.select_related与prefetch_related

res = models.Book.objects.all()
    for obj in res:
    print(obj.publish.name)  # 每次查询都需要走SQL

image

# select_related
res = models.Book.objects.select_related('publish')  # 先连表后查询封装
for obj in res:
    print(obj.publish.name)  # 不再走SQL查询
'''括号内不支持多对多字段  其他两个都可以'''

image

# prefetch_related
res = models.Book.objects.prefetch_related('publish')  # 子查询
   for obj in res:
      print(obj.publish.name)

image

'''
select_related是连表操作 先把表拼起来 然后整体封装成对象

prefetch_related是子查询 先查一张表然后再查另外一张表 然后把两条SQL查询的结果封装起来

两个其他差不多 用起来感觉不出来
'''

ORM事务操作

# MySQL事务:四大特性(ACID)
   原子性
   一致性
   隔离性
   持久性

# 相关SQL关键字
  start transcation; # 开启事务
  rollback; # 回滚
  commit; # 确认提交,之后不能再回滚
  savepoint; # 回滚点/保存点 可选择回滚到设置保存点的地方

# 相关重要概念
	脏读、幻读、不可重复读、MVCC多版本控制...
  • Django ORM三种开启事务的方式
方式1:配置文件数据库相关添加键值对   全局有效
    "ATOMIC_REQUESTS": True
# 每次请求所涉及到的orm操作同属于一个事务

image

方式2:装饰器       局部有效
from django.db import transaction
@transaction.atomic
def index(request):pass	

image

方式3:with上下文管理    局部有效
from django.db import transaction
def reg():
    with transaction.atomic():
        pass

ORM常用字段类型

# AutoField
int自增列,必须填入参数 primary_key=True 当model中如果没有自增列,则自动会创建一个列名为id的列

# CharField
   str字符串  max_length=32

# IntegerField
int 整型

# DecimalField
    max_digits # 位数 
    decimal_places #小数几位
    
# DateField
    auto_now auto_now_add
    
# DateTimeField
    auto_now auto_now_add

# BooleanField
   传布尔值自动存0或1
    
# TextField
   存储大段文本
    
# EmailField
   存储邮箱格式数据
    
# FileField
  传文件对象 自动保存到提前配置好的路径下并存储该路径信息
'''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)

ORM常用字段参数

primary_key 	主键
verbose_name	注释
max_length	字段长度
max_digits      小数总共多少位
decimal_places	小数点后面的位数
auto_now	每次操作数据自动更新事件
auto_now_add	首次创建自动更新事件后续不自动更新
null		允许字段为空
default		字段默认值
unique		唯一值
db_index	给字段添加索引
choices		当某个字段的可能性能够被列举完全的情况下使用
# choices的使用
用于可以被列举完全的数据
  	eg:性别 学历 工作经验 工作状态
      	class User(models.Model):
          username = 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.gender 
    user_obj.get_gender_display()
当值为1 获取男性 
当值为2 获取女性 
当值为3 获取中性 
当值不存在的时候, 直接返回输入的数值
"""
外键字段中使用related_name参数可以修改正向查询的字段名
"""
to		关联表
to_field	关联字段(不写默认关联数据主键)
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相似

标签:obj,models,res,查询,字段,ORM,max
From: https://www.cnblogs.com/super-xz/p/16993076.html

相关文章