Django框架6
Posted godlover
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django框架6相关的知识,希望对你有一定的参考价值。
目录
Django框架6
一: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类型字段
form django.db.models import Field
class RealCharField(Field):
def __init__(self, max_length, *args, **kwargs):
self.max_length = max_length # 拦截父类的方法 操作完之后 利用super再调用父类的方法
super().__init__(max_length=max_length, *args, *kwags)
def db_type(self, connection):
return 'char(%s)'%self.max_length
class Movie(models.Model):
textField = RealCharField(max_length=64)
字段内的关键性参数
? null
? default
? django 1.x默认就是级联删除与级联更新,django2.x需要你自己手动指定
? on_delete = models.CASCADE
? db_contraints = True
二:choices参数
? 用户的性别
? 学历
? 婚否
? 在职状态
? 客户来源
? 当你的数据能够被你列举完全的时候,就可以考虑使用choices参数
class UserInfo(models.Model):
username = mmodels.CharField(max_length=32)
gender_choices = (
(1, "男"),
(2, "女"),
(3, "其他"),
)
gender = models.IntegerField(choices=gender_choices)
# 该字段还是存数字 并且可以匹配关系之外的数字
record_choices = (('checked', "已签到"),
('vacate', "请假"),
('late', "迟到"),
('noshow', "缺勤"),
('leave_early', "早退"),
)
record = models.CharField("上课记录", choices=record_choices default="checked", max_length=64)
user_obj = models.UserInfo.objects.get(pk=1)
print(user_obj.username)
print(user_obj.gender)
# 针对choices参数字段 取值的时候 get_xxx_display() 获取到数字对应的值
print(user_obj.get_gender_display())
user_obj = models.UserInfo.objects.get(pk=4)
print(user_obj.gender)
# 针对没有注释信息的数据 get_xxx_display()获取到的还是数字本身
print(user_obj.get_gender_display())
演示结果:
![](https://img2018.cnblogs.com/blog/1850502/202001/1850502-20200109201624424-1974140203.png)
![](https://img2018.cnblogs.com/blog/1850502/202001/1850502-20200109201650578-601137098.png)
![](https://img2018.cnblogs.com/blog/1850502/202001/1850502-20200109201713863-1552284043.png)
三:orm数据库查询优化相关
公告的方法 查看所有的orm语句内部的sql语句
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'handlers': {
'console':{
'level':'DEBUG',
'class':'logging.StreamHandler',
},
},
'loggers': {
'django.db.backends': {
'handlers': ['console'],
'propagate': True,
'level':'DEBUG',
},
}
}
only与defer
res = models.Book.object.all()
print(res)
django orm查询都是惰性查询
res = models.Book.object.values('title')
print(res)
for r in res:
print(r.title) # 会报错
要想使res变成可操作句点符的对象就要使用到这个only和defer
res = models.Book.objects.only(‘title‘) # 這些对象内部只有title屬性
only作用:
? 括号内传字段 得到的结果是一个列表套数据对象 该对象内只会含有括号内指定的字段属性,对象点该字段属性是不会走数据库的,但是你点了非括号内的字段 也能够拿到数据 但是是重新走的数据库查询
res = models.Book.objects.defer(‘title‘) # defer与only互为反关系
defer作用:
? 括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性 对象点该字段属性会走数据库 但是点了非括号内的字段 就不会再走数据库
selected_related与prefetch_related
res = models.Book.objects.select_related(‘publish‘) 报错
res = models.Book.objects.select_related(‘publish‘)
selected_related作用:
? 内部是连表操作,先将关系表全部链接起来 之后再一次性查询出来 封装到对象中 数据对象之后再获取任意表中的数据的时候都不需要再走数据库了 因为全部封装成了对象的属性
? selected_related括号内只能传外键字段 并且不能是多对多字段 只能是一对多和一对一
? select_related(外键字段1_外键字段2 _外键字段3...)
prefetch_related作用:
? 内部是子查询 但是给你的感觉是连表操作,内部通过子查询将外键关联表中的数据也全部给你封装到对象中,之后对象点当前表或者外键关联表中的字段也都不需要走数据库了
优缺点比较
select_related连表操作 好处在于只走一次sql查询
? 耗时耗在 连接表的操作 10s
prefetch_related子查询 走两次sql查询
? 耗时耗在 查询次数 1s
四:orm中的事务操作
? 事务的四大特性
? 原子性
? 一致性
? 隔离性
? 持久性
? start transaction开启事务
? 数据库的三大设计范式
# 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 : controller 控制器(路由分发 urls.py)
? 本质:MTV本质也是MVC
六:图书管理系统(图书的增删改查功能的实现)
以上是关于Django框架6的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Django Summernote 中显示编程片段的代码块?
django.core.exceptions.ImproperlyConfigured: Requested setting DEFAULT_INDEX_TABLESPACE的解决办法(转)(代码片段