Django框架6

Stella981
• 阅读 601

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类型字段

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作用:

​ 括号内传字段 得到的结果是一个列表套数据对象 该对象内没有括号内指定的字段属性 对象点该字段属性会走数据库 但是点了非括号内的字段 就不会再走数据库

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开启事务

​ 数据库的三大设计范式

# 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

六:图书管理系统(图书的增删改查功能的实现)

    创建app之后注册
    templates文件夹创建以及配置文件中路径配置
    django连接MySQL
        1.配置文件配置
        2.__init__文件中指定
            import pymysql
            pymysql.install_as_MySQLdb()
    静态文件配置
        手动创建static文件夹
        配置文件中配置
        STATIC_URL = '/static/'
        STATICFILES_DIRS = [
            os.path.join(BASE_DIR,'static'),
            # 可以放多个文件夹路径  
        ]
        html页面上动态解析接口前缀
        {% load static %}
        <script src="{% static 'bootstrap/js/bootstrap-min.js' %}"></script>
    数据库迁移命令
    
    路由
        无名有名分组
        反写解析
            {% url 'add' %}
            reverse('add')
            
            {% url 'add' 1 %}
            reverse('add',args=(1,))
    
    模板的继承
        extends
        block
    
    orm查询
        单表操作
        多表操作
点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这