Django常用字段及参数、事务、数据库查询优化
常用字段
注意:
Django中没有设置对应char类型的字段,但可以支持自己定义。
自定义对应于数据库的char类型字段:
from django.db.models import Field class RealCharField(Field): ''' 自定义的char类型字段 ''' def __init__(self,max_length,*args,**kwargs): self.max_length = max_length #拦截一个父类的方法,操作完之后,利用super调用父类方法 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 class Movie(models.Model): textField = RealCharField(max_length=64)
常用字段列举
AutoField(primary_key=True) # int自增列,主键字段 CharField(max_length=32) # 对应数据库中的varchar字段,必须提供max_length参数, max_length表示字符长度 IntegerField() int BigIntergerField() bigint DecimalField() decimal EmailField() varchart(254) DateField() # 年月日 DateTimeField() # 年月日时分秒 BooleanField(Field) # 给该字段传布尔值 会对应成 数字0/1 TextField(Field) # 文本类型 FileField(Field) # 路径保存在数据库,文件上传到指定目录 # upload_to = '指定文件路径' # 给该FileField字段传文件对象 文件会自动保存到upload_to指定的文件夹下 然后该字段存文件的路径
常用字段参数
null # 用于表示某个字段可以为空。 unique #如果设置为unique=True 则该字段在此表中必须是唯一的 。 db_index #如果db_index=True 则代表着为此字段设置索引。 default #为该字段设置默认值。
DateField和DateTimeField字段参数
auto_now_add #配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。 auto_now #配置上auto_now=True,每次更新数据记录的时候会更新该字段。
外键字段参数
外键类型在ORM中用来表示外键关联关系
to #设置要关联的表 to_field #设置要关联的表的字段
Choice参数
如性别,学历,婚否等一些数据能够被你列举完全 你就可以考虑使用choices参数
class Userinfo(models.Model): username = models.CharField(max_length=32) gender_choices = ( (1, '男'), (2, '女'), (3, '其他'), ) gender = models.IntegerField(choices=gender_choices) #该字段还是存数字,还可以存匹配关系之外的数字
数据库查询优化
only()与defer()
only():括号内传字段 得到的结果是一个列表套数据对象,该对象内只含有括号内指定的字段。
对象点该字段属性是不会走数据库查询的,但是你一旦点了非括号内的字段,也能够拿到数据,但是是重新走的数据库查询
res = models.Book.objects.only('title') #这些对象内部只有title属性 for r in res: print(r.title) #不走数据库查询 print(r.price) #走数据库查询
defer():与only相反,括号内传字段 得到的结果是一个列表套数据对象,该对象内没有括号内指定的字段属性,对象点该字段属性会重复走数据库,但是你一旦点了非括号内的字段,就不走数据库查询了。
res = models.Book.objects.defer('title') # defer与only互为反关系 for r in res: print(r.title) #走数据库查询 print(r.price) #不走数据库查询
select_related和prefetch_related
select_related内部是链表操作,会将关系表全部连接起来拼成一个大表,之后一次性查询出来,把所有数据都封装到一个对象中。
数据对象再获取任意表中的数据的时候都不需要再走数据库了,因为全部封装成了对象的属性。
res = models.Book.objects.select_related('publish') for r in res: print(r.publish.name)
''' select_related括号内只能传外键字段,并且不能是多对多字段,只能是一对一和一对多字段 select_related(外键字段1__外键字段2__外键字段3) '''
prefetch_related内部是子查询,但是给你的感觉是链表操作。
内部通过子查询将外键管理表中的数据也全部给你封装到对象中,之后对象点当前表或外键关联表中的字段也都不需要走数据库了
两者优缺点比较:
select_related链表操作,优势在于只走一次sql查询,耗时耗在连接表的操作
prefetch_related子查询,走两次sql查询,耗时耗在查询次数
Django orm开启事务操作
事务的定义:将多个sql语句操作变成原子性操作,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性
事务的四大特性(ACID):
原子性
一致性
隔离性
持久性
# django orm 开启事务操作
from django.db import transaction
with transaction.atomic(): #在with代码块中执行的orm语句同属于一个事务 pass #代码块运行结束,事务就结束了
MTV与MVC模型
MTV django 号称是MTV框架
M:models
T:templates
V:views
MVC
M:models
V:views
C:contronner 控制器(路由分发 urls.py)
MTV本质也是MVC
原文地址:https://www.cnblogs.com/baohanblog/p/12172469.html
- Java 集合系列02之 Collection架构
- 开发者需要掌握的JS事件
- Java 集合系列03之 ArrayList详细介绍(源码解析)和使用示例
- Kosaraju算法、Tarjan算法分析及证明--强连通分量的线性算法
- 关于curl网站运维与开发的那些事
- 并查集Union-find及其在最小生成树中的应用
- go 语言的库文件放在哪里?如何通过nginx代理后还能正确获取远程地址
- 离线Tarjan算法-最近公共祖先问题
- Java文件上传下载实训
- 【网络编程系列】二:socket通信原理及实践
- textrank算法原理与提取关键词、自动提取摘要PYTHON
- 【网络编程系列】一:字节顺序的大端与小端表示法
- Linux下的make命令用法
- 增量数据丢失的原因分析(三)(r8笔记第91天)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Repository个人实践
- 摩斯码编解码器
- kettle学习笔记(三)——kettle资源库、运行方式与日志
- 使用Let's Encrypted HPPTS你的网站
- .net core web api + Autofac + EFCore 个人实践
- kettle学习笔记(六)——kettle转换步骤
- 记一次带层级结构列表数据计算性能优化
- kettle学习笔记(九)——子转换、集群与变量
- Activiti5工作流笔记一
- Activiti5工作流笔记二
- Activiti5工作流笔记三
- 短信验证码“最佳实践”
- 最近的项目系列1——core整合SPA
- 最近的项目系之2——core3.0整合Autofac
- 最近的项目系之3——core3.0整合Senparc