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)
自定义char字段
常用字段列举
AutoField(primary_key=True) # int自增列,主键字段 CharField(max_length=32) # 对应数据库中的varchar字段,必须提供max_length参数, max_length表示字符长度 IntegerField() int BigIntegerField() 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)
MVC模型是一种使用 Model View Controller( 模型-视图-控制器)设计创建 Web 应用程序的模式。
Model(模型):是应用程序中用于处理应用程序数据逻辑的部分。
通常模型对象负责在数据库中存取数据。
View(视图):是应用程序中处理数据显示的部分。
通常视图是依据模型数据创建的。
Controller(控制器):是应用程序中处理用户交互的部分。
通常控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MTV模型
FLask用的是MTV的模式
所谓的MTV ( Model–Template–View ),翻译一下就是模型、模板、视图。
一般是用户通过浏览器向我们的服务器发起一个请求(request),
这个请求回去访问视图函数,(如果不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,然后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
Django常用字段及参数、事务、数据库查询优化的更多相关文章
- ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化
聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...
- Django 常用字段和参数
一.ORM字段 类型 说明 AutoField 一个自动增加的整数类型字段.通常你不需要自己编写它,Django会自动帮你添加字段:`id = models.AutoField(primary_key ...
- Django --- 常用字段及参数
1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...
- Django创建数据库常用字段及参数
Django创建数据库常用字段及参数 常用字段 1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列 ...
- Django ORM中常用字段和参数
一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...
- Django ORM 常用字段和参数
Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...
- Django框架 之 ORM 常用字段和参数
Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...
- Django框架(十一)—— 常用字段、参数、元信息、多对多关联关系
目录 常用字段和参数 一.ORM字段 二.ORM参数 三.关系字段 1.ForeignKey 2.OneToOneFiled 3.ManyToManyField 四.元信息 五.多对多关联关系的三种方 ...
- day07 ORM中常用字段和参数
day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...
随机推荐
- Spark-shell批量命令执行脚本
#!/bin/bash source /etc/profile exec $SPARK_HOME/bin/spark-shell --queue tv --name spark-sql-test -- ...
- H3C 常用接口和线缆
- oracle等式比较和范围比较
当WHERE子句中有索引列, ORACLE不能合并它们,ORACLE将用范围比较. 举例: DEPTNO上有一个非唯一性索引,EMP_CAT也有一个非唯一性索引. SELECT ENAME FROM ...
- iptables禁止强制访问指定的站点
要使192.168.52.0/24网络内的计算机(这此计算机的网关应设为192.168.52.10)强制访问指定的站点,在做为防火墙的计算机(192.168.52.10)上应添加以下规则: 1. 打开 ...
- Project Euler Problem 7-10001st prime
素数线性筛 MAXN = 110100 prime = [0 for i in range(210000)] for i in range(2,MAXN): if prime[i] == 0: pri ...
- springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)
一.注解方式 pom <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId& ...
- 报错:org.springframework.beans.factory.BeanCreationException
报错码为以下内容,把自己走的坑贴出来,免得大家如同样的坑.以下解决方法仅供参考. ERROR [RMI TCP Connection(3)-127.0.0.1] - Context initializ ...
- H3C 什么是OSPF
- 【a403】遍历树问题
Time Limit: 1 second Memory Limit: 32 MB [问题描述] 我们都很熟悉二叉树的前序.中序.后序遍历,在数据结构中常提出这样的问题:已知一棵二叉树的前序和中序遍历, ...
- el-table翻页序号不从1开始(已解决)
法一:赋值方式(亲测有效) <el-table-column type="index" fixed="left" align="center&q ...