注意:html
Django中没有设置对应char类型的字段,但能够支持本身定义。web
自定义对应于数据库的char类型字段:sql
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 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 #为该字段设置默认值。
auto_now_add #配置auto_now_add=True,建立数据记录的时候会把当前时间添加到数据库。 auto_now #配置上auto_now=True,每次更新数据记录的时候会更新该字段。
外键类型在ORM中用来表示外键关联关系数据库
to #设置要关联的表 to_field #设置要关联的表的字段
如性别,学历,婚否等一些数据可以被你列举彻底 你就能够考虑使用choices参数django
class Userinfo(models.Model): username = models.CharField(max_length=32) gender_choices = ( (1, '男'), (2, '女'), (3, '其余'), ) gender = models.IntegerField(choices=gender_choices) #该字段仍是存数字,还能够存匹配关系以外的数字
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内部是链表操做,会将关系表所有链接起来拼成一个大表,以后一次性查询出来,把全部数据都封装到一个对象中。
数据对象再获取任意表中的数据的时候都不须要再走数据库了,由于所有封装成了对象的属性。框架
res = models.Book.objects.select_related('publish') for r in res: print(r.publish.name)
''' select_related括号内只能传外键字段,而且不能是多对多字段,只能是一对一和一对多字段 select_related(外键字段1__外键字段2__外键字段3) '''
prefetch_related内部是子查询,可是给你的感受是链表操做。ide
内部经过子查询将外键管理表中的数据也所有给你封装到对象中,以后对象点当前表或外键关联表中的字段也都不须要走数据库了模块化
二者优缺点比较:
select_related链表操做,优点在于只走一次sql查询,耗时耗在链接表的操做
prefetch_related子查询,走两次sql查询,耗时耗在查询次数
事务的定义:将多个sql语句操做变成原子性操做,要么同时成功,有一个失败则里面回滚到原来的状态,保证数据的完整性和一致性
事务的四大特性(ACID):
原子性
一致性
隔离性
持久性
# django orm 开启事务操做
from django.db import transaction
with transaction.atomic(): #在with代码块中执行的orm语句同属于一个事务 pass #代码块运行结束,事务就结束了
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(控制器):是应用程序中处理用户交互的部分。
一般控制器负责从视图读取数据,控制用户输入,并向模型发送数据。
MVC的优缺点
优势:
把业务逻辑所有分离到Controller中,模块化程度高。当业务逻辑变动的时候,不须要变动View和Model,只须要Controller换成另一个Controller就好了 。
观察者模式能够作到多视图同时更新。
缺点:
Controller测试困难。由于视图同步操做是由View本身执行,而View只能在有UI的环境下运行。在没有UI环境下对Controller进行单元测试的时候,Controller业务逻辑的正确性是没法验证的:Controller更新Model的时候,没法对View的更新操做进行断言。
View没法组件化。View是强依赖特定的Model的,若是须要把这个View抽出来做为一个另一个应用程序可复用的组件就困难了。由于不一样程序的的Domain Model是不同的
MTV模型
FLask用的是MTV的模式
所谓的MTV ( Model–Template–View ),翻译一下就是模型、模板、视图。
通常是用户经过浏览器向咱们的服务器发起一个请求(request),
这个请求回去访问视图函数,(若是不涉及到数据调用,那么这个时候视图函数返回一个模板也就是一个网页给用户),视图函数调用模型,模型去数据库查找数据,而后逐级返回,视图函数把返回的数据填充到模板中空格中,最后返回网页给用户。
Django的MTV模式
Django的MTV模式的本质和MVC是同样的,也是为了各组件间保持松耦合关系,只是定义有些不一样,
Django的MTV分别是:
M 带包模型(Model) 负责业务对象和数据库的关系映射(ORM)
T 表明模板(Template) 负责如何把页面展现给用户(html)
V 表明视图 (View) 负责业务逻辑 并在适当时候调用Model和Template
除了以上三层外,还须要一个URL分发器、他的做用是将一个个URL的页面请求分发给不一样的View处理,web服务器(中间件)收到一个http请求
1.Django在URLconf里查找对应的视图(view)函数来处理http请求
2.视图函数调用相应的数据模型来存储数据、调用相应的模板向用户展现页面
3.视图函数处理结束后返回一个http的相应给web服务器
4.web 服务器将响应发送给客户端
MTV的响应模式以下:1,中间件接收到一个http请求2,django在url路由系统中查找对应的视图来处理http请求3,视图函数调用对应的model模型来存储数据、调用相应的模板来展现页面