Django框架6
[TOC]
一:models常用字段及参数
AutoField(primary_key=True) 主键字段
CharField(max_length=32) varchar(32)
IntergerField() int
BigIntegerField() bigint
DecimalField() decimal
EmailField() varchart(254)
DateField() date 年月日
DateTimeField() datetime 年月日时分秒
auto_now: 每次编辑数据的时候都会自动更新该字段时间
auto_now_add: 创建数据的时候自动更新
BooleanField(Field)
给该字段传布尔值 会对应成 数字0/1
is_delete
is_status
is_vip
TextField(Field)
文本类型
存储大段文本
FileField(Field)
字符串,路径保存在数据库,文件上传到指定的目录,只存在文件路径
upload_to = ‘指定文件路径’
给该字段传文件对象 文件会自动保存到upload_to指定的文件夹下, 然后该字段存文件的路径
如何自定义char类型字段
1form django.db.models import Field 2 3class RealCharField(Field): 4 def __init__(self, max_length, *args, **kwargs): 5 self.max_length = max_length # 拦截父类的方法 操作完之后 利用super再调用父类的方法 6 super().__init__(max_length=max_length, *args, *kwags) 7 8 def db_type(self, connection): 9 return 'char(%s)'%self.max_length 10 11class Movie(models.Model): 12 textField = RealCharField(max_length=64) 13 14
字段内的关键性参数
null
default
django 1.x默认就是级联删除与级联更新,django2.x需要你自己手动指定
on_delete = models.CASCADE
db_contraints = True
二:choices参数
用户的性别
学历
婚否
在职状态
客户来源
当你的数据能够被你列举完全的时候,就可以考虑使用choices参数
1class UserInfo(models.Model): 2 username = mmodels.CharField(max_length=32) 3 gender_choices = ( 4 (1, "男"), 5 (2, "女"), 6 (3, "其他"), 7 ) 8 gender = models.IntegerField(choices=gender_choices) 9 # 该字段还是存数字 并且可以匹配关系之外的数字 10 record_choices = (('checked', "已签到"), 11 ('vacate', "请假"), 12 ('late', "迟到"), 13 ('noshow', "缺勤"), 14 ('leave_early', "早退"), 15 ) 16 record = models.CharField("上课记录", choices=record_choices default="checked", max_length=64) 17 18 user_obj = models.UserInfo.objects.get(pk=1) 19 print(user_obj.username) 20 print(user_obj.gender) 21 # 针对choices参数字段 取值的时候 get_xxx_display() 获取到数字对应的值 22 print(user_obj.get_gender_display()) 23 24 user_obj = models.UserInfo.objects.get(pk=4) 25 print(user_obj.gender) 26 # 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身 27 print(user_obj.get_gender_display()) 28 29 演示结果: 30 31  32 33 34  35 36 37 38  39 40 41 42
三:orm数据库查询优化相关
公告的方法 查看所有的orm语句内部的sql语句
1LOGGING = { 2 'version': 1, 3 'disable_existing_loggers': False, 4 'handlers': { 5 'console':{ 6 'level':'DEBUG', 7 'class':'logging.StreamHandler', 8 }, 9 }, 10 'loggers': { 11 'django.db.backends': { 12 'handlers': ['console'], 13 'propagate': True, 14 'level':'DEBUG', 15 }, 16 } 17}
only与defer
1res = models.Book.object.all() 2print(res) 3django orm查询都是惰性查询 4 5res = models.Book.object.values('title') 6print(res) 7for r in res: 8 print(r.title) # 会报错 9 10要想使res变成可操作句点符的对象就要使用到这个only和defer 11
res = models.Book.objects.only('title') # 這些对象内部只有title屬性
only作用:
括号内传字段 得到的结果是一个列表套数据对象 该对象内只会含有括号内指定的字段属性,对象点该字段属性是不会走数据库的,但是你点了非括号内的字段 也能够拿到数据 但是是重新走的数据库查询
res = models.Book.objects.defer('title') # defer与only互为反关系
defer作用:
括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性 对象点该字段属性会走数据库 但是点了非括号内的字段 就不会再走数据库
select_related与prefetch_related
res = models.Book.objects.select_related('publish') 报错
res = models.Book.objects.select_related('publish')
select_related作用:
内部是连表操作,先将关系表全部链接起来 之后再一次性查询出来 封装到对象中 数据对象之后再获取任意表中的数据的时候都不需要再走数据库了 因为全部封装成了对象的属性
select_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一
select_related(外键字段1_外键字段2 _外键字段3...)
prefetch_related作用:
内部是子查询 但是给你的感觉是连表操作,内部通过子查询将外键关联表中的数据也全部给你封装到对象中,之后对象点当前表或者外键关联表中的字段也都不需要走数据库了 有几个外键字段 就走几次数据库查询
优缺点比较
select_related连表操作 好处在于只走一次sql查询
耗时耗在 连接表的操作 10s
prefetch_related子查询 走两次sql查询
耗时耗在 查询次数 1s
四:orm中的事务操作
事务的四大特性
原子性
一致性
隔离性
持久性
start transaction开启事务
数据库的三大设计范式
1# django orm开启事务操作 2from django.db import transaction 3with transaction.atomic(): 4 # 在with代码块中执行的orm语句同属于一个事务 5 pass 6# 代码块运行结束 事务就结束了
五:MTV与MVC模型
MTV django MTV框架
M:models
T : templates
V : views
MVC
M : models
V : views
C : controller 控制器(路由分发 urls.py)
本质:MTV本质也是MVC
六:图书管理系统(图书的增删改查功能的实现)
1 创建app之后注册 2 templates文件夹创建以及配置文件中路径配置 3 django连接MySQL 4 1.配置文件配置 5 2.__init__文件中指定 6 import pymysql 7 pymysql.install_as_MySQLdb() 8 静态文件配置 9 手动创建static文件夹 10 配置文件中配置 11 STATIC_URL = '/static/' 12 STATICFILES_DIRS = [ 13 os.path.join(BASE_DIR,'static'), 14 # 可以放多个文件夹路径 15 ] 16 html页面上动态解析接口前缀 17 {% load static %} 18 <script src="{% static 'bootstrap/js/bootstrap-min.js' %}"></script> 19 数据库迁移命令 20 21 路由 22 无名有名分组 23 反写解析 24 {% url 'add' %} 25 reverse('add') 26 27 {% url 'add' 1 %} 28 reverse('add',args=(1,)) 29 30 模板的继承 31 extends 32 block 33 34 orm查询 35 单表操作 36 多表操作