-
ORM查询优化(重点)
-
ORM事务操作
-
ORM常用字段类型
-
ORM常用字段参数
-
ORM三种创建多对多的方式
ORM查询优化(重点)
1.ORM查询默认都是惰性查询
'''获取的是数据对象'''
res = models.Book.objects.all()
print(res)

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

3.only与defer
'''数据对象+含有指定字段对应的数据'''
res = models.Book.objects.only('title', 'price')
for obj in res:
print(obj.title)
print(obj.price)
print(obj.publish_time)


res = models.Book.objects.defer('title', 'price')
for obj in res:
print(obj.title)
print(obj.price)
print(obj.publish_time)


4.select_related与prefetch_related
res = models.Book.objects.all()
for obj in res:
print(obj.publish.name)

res = models.Book.objects.select_related('publish')
for obj in res:
print(obj.publish.name)
'''括号内不支持多对多字段 其他两个都可以'''

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

'''
select_related是连表操作 先把表拼起来 然后整体封装成对象
prefetch_related是子查询 先查一张表然后再查另外一张表 然后把两条SQL查询的结果封装起来
两个其他差不多 用起来感觉不出来
'''
ORM事务操作
原子性
一致性
隔离性
持久性
start transcation;
rollback;
commit;
savepoint;
脏读、幻读、不可重复读、MVCC多版本控制...
方式1:配置文件数据库相关添加键值对 全局有效
"ATOMIC_REQUESTS": True

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

方式3:with上下文管理 局部有效
from django.db import transaction
def reg():
with transaction.atomic():
pass
ORM常用字段类型
int自增列,必须填入参数 primary_key=True 当model中如果没有自增列,则自动会创建一个列名为id的列
str字符串 max_length=32
int 整型
max_digits
decimal_places
auto_now auto_now_add
auto_now auto_now_add
传布尔值自动存0或1
存储大段文本
存储邮箱格式数据
传文件对象 自动保存到提前配置好的路径下并存储该路径信息
'''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 当某个字段的可能性能够被列举完全的情况下使用
用于可以被列举完全的数据
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相似
ORM三种创建多对多的方式
1.全自动创建
class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author')
class Author(models.Model):
name = models.CharField(max_length=32)
优势:自动创建第三张表 并且提供了add、remove、set、clear四种操作
劣势:第三张表无法创建更多的字段 扩展性较差
2.纯手动创建
class Book(models.Model):
title = models.CharField(max_length=32)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book')
author = models.ForeignKey(to='Author')
others = models.CharField(max_length=32)
join_time = models.DateField(auto_now_add=True)
优势:第三张表完全由自己创建 扩展性强
劣势:编写繁琐 并且不再支持add、remove、set、clear以及正反向概念
3.半自动创建
class Book(models.Model):
title = models.CharField(max_length=32)
authors = models.ManyToManyField(to='Author',
through='Book2Author', through_fields=('book','author')
)
class Author(models.Model):
name = models.CharField(max_length=32)
class Book2Author(models.Model):
book = models.ForeignKey(to='Book', on_delete=models.CASCADE)
author = models.ForeignKey(to='Author', on_delete=models.CASCADE)
others = models.CharField(max_length=32)
join_time = models.DateField(auto_now_add=True)
优势:第三张表完全由自己创建 扩展性强 正反向概念依然清晰可用
劣势:编写繁琐不再支持add、remove、set、clear
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· 展开说说关于C#中ORM框架的用法!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?