常用字段

注意:

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常用字段及参数、事务、数据库查询优化的更多相关文章

  1. ORM中聚合函数、分组查询、Django开启事务、ORM中常用字段及参数、数据库查询优化

    聚合函数 名称 作用 Max() 最大值 Min() 最小值 Sum() 求和 Count() 计数 Avg() 平均值 关键字: aggregate 聚合查询通常都是配合分组一起使用的 关于数据库的 ...

  2. Django 常用字段和参数

    一.ORM字段 类型 说明 AutoField 一个自动增加的整数类型字段.通常你不需要自己编写它,Django会自动帮你添加字段:`id = models.AutoField(primary_key ...

  3. Django --- 常用字段及参数

    1 ORM字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. IntegerField 一个整数类型 ...

  4. Django创建数据库常用字段及参数

    Django创建数据库常用字段及参数 常用字段 1.models.AutoField 自增列= int(11) 如果没有的话,默认会生成一个名称为 id 的列,如果要显示的自定义一个自增列,必须将给列 ...

  5. Django ORM中常用字段和参数

    一些说明: 表myapp_person的名称是自动生成的,如果你要自定义表名,需要在model的Meta类中指定 db_table 参数,强烈建议使用小写表名,特别是使用MySQL作为后端数据库时. ...

  6. Django ORM 常用字段和参数

    Django ORM 常用字段和参数 一:常用字段 AutoField int自增列,必须填入参数 primary_key=True.当model中如果没有自增列,则自动会创建一个列名为id的列. I ...

  7. Django框架 之 ORM 常用字段和参数

    Django框架 之 ORM 常用字段和参数 浏览目录 常用字段 字段合集 自定义字段 字段参数 DateField和DateTimeField 关系字段 ForeignKey OneToOneFie ...

  8. Django框架(十一)—— 常用字段、参数、元信息、多对多关联关系

    目录 常用字段和参数 一.ORM字段 二.ORM参数 三.关系字段 1.ForeignKey 2.OneToOneFiled 3.ManyToManyField 四.元信息 五.多对多关联关系的三种方 ...

  9. day07 ORM中常用字段和参数

    day07 ORM中常用字段和参数 今日内容 常用字段 关联字段 测试环境准备 查询关键字 查看ORM内部SQL语句 神奇的双下划线查询 多表查询前提准备 常用字段 字段类型 AutoField in ...

随机推荐

  1. POJ 3159 Candies、

    题意:n个小孩,m个比较(给你两个孩子代号a,b.然后c意味着a比b最多只能少c个糖果),问1和n之间差距最大的糖果数量. 思路:这是一个差分约束思路 不懂得:传送门, 转化一下就是一个SPFA求最短 ...

  2. 2019-8-31-dotnet-core-黑科技·String.IndexOf-性能

    title author date CreateTime categories dotnet core 黑科技·String.IndexOf 性能 lindexi 2019-08-31 16:55:5 ...

  3. CSS中常用的简写模式

    一.font属性简写 font-style:字体样式 normal 默认值.浏览器显示一个标准的字体样式. italic 浏览器会显示一个斜体的字体样式. oblique 浏览器会显示一个倾斜的字体样 ...

  4. Python--day47--mysql执行计划

    1,什么是mysql执行计划? 让mysql预估执行操作:在要执行的语句前面加explain,就不会真的执行sql语句,只是给出了要执行的数据的情况,如大约有多少条,查询类型.

  5. 2019-1-29-C#-Task.Run-和-Task.Factory.StartNew-区别

    title author date CreateTime categories C# Task.Run 和 Task.Factory.StartNew 区别 lindexi 2019-01-29 16 ...

  6. springboot整合mybatis完整示例, mapper注解方式和xml配置文件方式实现(我们要优雅地编程)

    一.注解方式 pom <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId& ...

  7. H3C OSPF基本配置命令

  8. [转]【转】大型高性能ASP.NET系统架构设计

    大型高性能ASP.NET系统架构设计 大型动态应用系统平台主要是针对于大流量.高并发网站建立的底层系统架构.大型网站的运行需要一个可靠.安全.可扩展.易维护的应用系统平台做为支撑,以保证网站应用的平稳 ...

  9. H3C IEEE EUI-64格式

  10. 基于AutoIt3的打印机安装

    #Region ;**** 编译指令由 AutoIt3Wrapper 选项编译窗口创建 **** #AutoIt3Wrapper_Icon=favicon.ico #AutoIt3Wrapper_Co ...