zoukankan      html  css  js  c++  java
  • 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作用:

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

    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查询
    		单表操作
    		多表操作
  • 相关阅读:
    java8学习之Optional深入详解
    java8学习之Supplier与函数式接口总结
    java8学习之Predicate深入剖析与函数式编程本质
    conda
    matplotlib-折线图、散点图
    欧盟GDPR通用数据保护条例-原文
    python装饰器的应用案例
    python练习汇总
    python分段算利润、税收
    需求-shidebing
  • 原文地址:https://www.cnblogs.com/godlover/p/12173347.html
Copyright © 2011-2022 走看看