zoukankan      html  css  js  c++  java
  • django9

    昨日回顾

    1 自定义过滤器和标签
    	-第一步:注册app
        -第二步:在app下创建一个templatetags的包
        -第三步:在包下新建py文件(名字随意)
        	from django import template
            register=template.Library()
            @register.filter  过滤器
            @register.simple_tag  标签
        -第四步:在模板中使用
        	{% load xx.py%}
            {{''|过滤器名字:''}}
            {% 标签名 参数 参数%}
    2 静态文件引入的三种方式
    	-第一种:/static/sdsa/sdfasdf.jpg
        -第二种:
        	{% load static %}
            {% static 参数(路径)%}
    	-第三种:
        	{% load static %}
            src='{%get_static_prefiex %}拼路径'
            
    3 模板的导入
    	-写了一个xx.html   (html片断)
        -在其他的yy.html直接引用它,
        {% include 'xx.html'%}
        
    4 模板的继承
    	-写一个母版  base.html   # 模板名字随意
        {% block 名字 %}
        {%endblock%}
        -在其它模板中继承母版
        {% extends '母版的名字'%}
        {% block 名字%}
        其他html代码
        {%endblock%}
        
    5 inclusion_tag
    	-第一步:注册app
        -第二步:在app下创建一个templatetags的包
        -第三步:在包下新建py文件(名字随意)
        	from django import template
            register=template.Library()
            @register.inclusion_tag('模板名字')    # 模板是html片段,可以使用返回的字典,渲染模板
            def xx():
                return {key:value}
        -第四步:在模板中使用
        	{% load xx.py%}
            {% 名子 参数%}
    # 主要的作用是将代码和html分离,更加简洁
    
    6 单表常见字段,常见字段属性
    	-常见字段
        	-AutoField:自增 # mysql即使不设置也会自动设置自增主键,要用自增主键做聚簇索引
            -CharField:varchar类型
            -DecimalField:带小数点数字
            -DateTimeField:年月日时分秒
            -DateField:年月日
       -常见字段属性
    		-primary-key 主键
        	-max_length   最大长度的
            -max_digits=5,  数字最大长度
            -decimal_places=2 小数点后几位
            # 数据时间会有时区问题,需设置
            -auto_now: 配置上auto_now=True,每次更新数据记录的时候会更新该字段
            -auto_now_add:配置auto_now_add=True,创建数据记录的时候会把当前时间添加到数据库。
            ###补充:公司内的项目字段:create_time一般会设置成auto_now_add=True   update_time一般会设置成auto_now=True
            -#####公共的
            -null         是否可以为空
            -default      默认值是
            -db_index     是否建索引
            -unique       是否是唯一
    7 单表的新增两种方式
    
    8 单表的查询
    	-models.Book.object.all()     # 查询所有
    	-filter(key=value,key=value)  # 返回queryset对象(列表)
        -filter(key=value,key=value)[0] #取第一个
        -filter(key=value,key=value).first() #取第一个
        -get(key=value,key=value)   # 返回一个对象,查询必须由且仅有一个,不符合这个条件都抛异常
    

    今日内容

    1 常用和非常用字段和参数概览

    # 常用字段
    	-IntegerField   # 整数
        -AutoField
        -BooleanField
        -CharField
        -DateField
        -DateTimeField
        -DecimalField
        -FileField   # 上传文件,本质是varchar,把文件保存到一个位置,数据库只存一个路径
        -ImageField   # 图片,本质是varchar,继承了FileField
        -TextField   # 存大文本 例如存文章,如果文章过长,varchar保存不了,就需要Text
        -EmailField   # 本质是varchar 作用:Django Admin以及ModelForm中提供验证机制,如果存不是email的类型的varchar也能存进去
    """
    在django中使用DateTimeField,DateField存储时间相关时,默认存当前时间,但是存储的是当前utc的时间,所以我们存到数据库的时间是差8个小时,通过设置,让存储的时候就存东八区时间,
    """
    ========================================非常用字段
    	-BigAutoField  # 跟AutoField区别,能比AutoField存储的数字长度更长
        -SmallIntegerField   # 数字大小比IntegerField小,例如存储人的年龄可以使用
        -PositiveSmallIntegerField   # 正整数更小类型
        -PositiveIntegerField
        -BigIntegerField
        
        
                'AutoField': 'integer AUTO_INCREMENT',
                'BigAutoField': 'bigint AUTO_INCREMENT',
                'BinaryField': 'longblob',   # 存二进制类型
                'BooleanField': 'bool',
                'CharField': 'varchar(%(max_length)s)',
                'CommaSeparatedIntegerField': 'varchar(%(max_length)s)',
                'DateField': 'date',
                'DateTimeField': 'datetime',
                'DecimalField': 'numeric(%(max_digits)s, %(decimal_places)s)',
                'DurationField': 'bigint',
                'FileField': 'varchar(%(max_length)s)',
                'FilePathField': 'varchar(%(max_length)s)',
                'FloatField': 'double precision',
                'IntegerField': 'integer',
                'BigIntegerField': 'bigint',
                'IPAddressField': 'char(15)',  # 存ip地址
                'GenericIPAddressField': 'char(39)',
                'NullBooleanField': 'bool',  # 可以为空的bool类型
                'OneToOneField': 'integer',
                'PositiveIntegerField': 'integer UNSIGNED',
                'PositiveSmallIntegerField': 'smallint UNSIGNED',
                'SlugField': 'varchar(%(max_length)s)',
                'SmallIntegerField': 'smallint',
                'TextField': 'longtext',
                'TimeField': 'time',
                'UUIDField': 'char(32)',
                    
    # 常用参数
    	-null
        -max_length
        -default
        -primary_key 
        -unique
        -db_index
        -choices:比较常用
    	-blank   # django admin里提交数据,如果blank不写成null的时候,必填,起限制作用
      
    # 元数据
    	-必须记住的,在原来的类中继续写类中类,必须是以下类名
        class Meta:
             # 此处是修改表名,表名默认是app的名字+类名
            db_table = "book"
            #建立联合索引,里面写字段名字,如果只是单列的索引,直接在字段后面写就行了
            index_together = [
                ("name", "publish"),
            ]
            # 联合唯一索引
            unique_together = (("name", "publish"),)
            
       -了解
    	    # admin中显示的表名称,如果没有此参数,那么就是类名,如果写了'图书表',那么会改成图书表s,如果有verbose_name_plural='图书表',那么会使用verbose_name_plural的值,一般两者同时使用
            verbose_name='图书表'
            #verbose_name加s
            verbose_name_plural='图书表'
    

    image-20201013163813117

    2 打印原生sql

    # 在视图函数中导入models,在视图函数中每增删改查都对应相应的sql语句,如果想在终端显示,那么需要在setting里面配置,在setting找空地方写入日志文件配置
    1 配置文件粘贴
    LOGGING = {
        'version': 1,
        'disable_existing_loggers': False,
        'handlers': {
            'console':{
                'level':'DEBUG',
                'class':'logging.StreamHandler',
            },
        },
        'loggers': {
            'django.db.backends': {
                'handlers': ['console'],
                'propagate': True,
                'level':'DEBUG',
            },
        }
    }
    

    3 查询表记录API

    # 只要每次返回的结果是queryset对象,那么就可以链式调用
    <1> all():                  查询所有结果,返回的是queryset对象,all是queryset对象的方法,目前先当成列表,如果返回的是queryset对象,那么在后面可以继续调用queryset对象的方法,知道返回的不是queryset对象;# 在orm中all(),查询的sql语句后面可以发现有limit 21(数字不确定)限制,说明返回的结果是一个生成器,此处用到了生成器相关的知识,因此在使用的时候,如果需要所有的数据,需要进行for循环,结果可以在终端显示每过21条数据后终端会打印一条sql语句
    <2> filter(**kwargs):       它包含了与所给筛选条件相匹配的对象,filter是queryset对象的方法,返回的也是queryset对象里面同时写多个关键字参数,那么在原生sql语句中是同过where...and来查询的
    <3> get(**kwargs):          返回与所给筛选条件相匹配的对象,返回结果有且只有一个,如果符合筛选条件的对象超过一个或者没有都会抛出错误。get是queryset对象的方法,返回的是类的对象
    <4> exclude(**kwargs):      它包含了与所给筛选条件不匹配的对象,查询不是...的数据,返回的是queryset对象,此处和filter结合的前后会产生sql优化的问题
    <5> order_by(*field):       对查询结果排序('-id') 如果字段前面加-,那么则是倒叙,该字段参数可以多个,也就是说在执行前面的字段,如果相同了后,再按后面的字段排序,返回的是queryset对象
    <6> reverse():              对查询结果反向排序,必须结合order_by使用,对结果进行反转,等同于(-字段)   查询时在sql层面就转,而不是将数据从数据库拿出来后再进行反转,返回的是queryset对象
    <8> count():                返回数据库中匹配查询(QuerySet)的对象数量。查询时在sql层面就统计,而不是将数据从数据库拿出来后再进行统计
    <9> first():                返回第一条记录,返回的不再是queryset对象
    <10> last():                返回最后一条记录  返回的不再是queryset对象
    <11> exists():              如果QuerySet包含数据,判断结果存不存在,在就返回True,否则返回False  返回的不再是queryset对象
    <12> values(*field):        设置只查询某些字段,返回一个ValueQuerySet——一个特殊的QuerySet,从里面取出来后得到的并不是一系列model的实例化对象,而是一个可迭代的字典序列
    <13> values_list(*field):   它与values()非常相似,它返回的是一个元组序列只有value的值,values返回的是一个字典序列key,value
    <14> distinct():            从返回结果中剔 除重复纪录,返回的是queryset对象
    

    4 基于双下划线的模糊查询

    # 字段名__关键字
    #1  价格在[100,200,300]这个范围内
    Book.objects.filter(price__in=[100,200,300])
    # 2 大于,小于,大于等于,小于等于
    Book.objects.filter(price__gt=100)
    Book.objects.filter(price__lt=100)
    Book.objects.filter(price__gte=100)
    Book.objects.filter(price__lte=100)
    # 3 范围
    Book.objects.filter(price__range=[100,200]) # 左右都有 
    # 包含
    Book.objects.filter(title__contains="python")
    # 4 忽略大小写包含
    Book.objects.filter(title__icontains="python")
    # 5 以xx开头
    Book.objects.filter(title__startswith="py")
    # 6 时间类型,年份是2012年的
    Book.objects.filter(pub_date__year=2012)
    
    
    
        # 基于双下滑线的模糊查询
        # 1 in条件
        # res=models.Book.objects.filter(name__in=['西游记', '金梅'])
        # print(res)
        # 2 大于,小于,大于等于,小于等于
        # res=models.Book.objects.filter(id__gt=2)
        # res=models.Book.objects.filter(id__lt=2)
        # res=models.Book.objects.filter(id__gte=2)
        # res=models.Book.objects.filter(id__lte=2)
        # print(res)
    
        # 3 rang 范围 BETWEEN 1 AND 3
        # res=models.Book.objects.filter(id__range=[1,3])
        # print(res)
    
        # 包含
        # res=models.Book.objects.filter(name__contains="金")
        # print(res)
        # 忽略大小写的包含
        # res=models.Book.objects.filter(name__icontains="金")
        # print(res)
        #
        # res=models.Book.objects.filter(name__startswith="金")
        # print(res)
        # res = models.Book.objects.filter(name__endswith='梅')
        # print(res)
    
        #
        # res=models.Book.objects.filter(publish_date__year='2020')
        # res=models.Book.objects.filter(publish_date__month='9')
        # print(res)
    

    5 删除表记录

        # 删除的两种方式
        # 第一种:queryset的delete方法
        # res=models.Book.objects.all().delete()
        # print(res)
        # 第二种:对象自己的delete方法
        # book = models.Book.objects.all().filter(name='金梅').first()
        # print(type(book))
        # res=book.delete()
    

    6 修改表记录

       #修改记录
        # 第一种:queryset的update方法
        # res=models.Book.objects.filter(publish='东京').update(name='金梅1')
        # print(res)
        # 第二种:对象自己的
        book = models.Book.objects.filter(name='xxx').last()
        book.name='asdfasd'
        book.save()
    

    7 python脚本中调用django环境

    # 在脚本中调用djagno服务
    import os
    if __name__ == '__main__':
        #1  引入django配置文件
        os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'day67.settings')
        # 2 让djagno启动
        import django
        django.setup()
        # 3 使用表模型
        from app01 import models
        models.Book.objects.create(name='测试书籍',publish='xx出版社')
    # 原来的时候需要在地址栏中输入地址,自动调用执行视图函数里面的增删改查,此方法可以直接右键运行,执行此中的代码
    

    补充

    1 时区和国际化问题

    setting.py中
    1 后台管理汉语问题
    	LANGUAGE_CODE = 'zh-hans'  # 管理后台看到的就是中文
    2 时区问题(使用东八区)改成下面的形式
    	TIME_ZONE = 'Asia/Shanghai'
        USE_TZ = False
    

    2 django admin(管理后台的简单使用)

    0 管理后台是django提供的可以快速对表进行增删查改操作
    1 创建一个后台管理账号
        python3 manage.py createsuperuser
        输入用户名
        输入邮箱(可以不填,敲回车)
        输入密码
        确认密码
        # 超级用户创建出来了,可以登录管理后台了
        后台都是英文,可以设置 LANGUAGE_CODE = 'zh-hans'
    2 admin中表中一行一行的数据显示我们定制的样子
    	重写模型类的__str__方法
        def __str__(self):
            return self.name
    

    3 blank参数作用

    1 需要把book表注册到admin中
    	在app下的admin.py中写
        from app01 import models
    	# 把book表注册一些,管理后台就能看到了
    	admin.site.register(models.Book) # 类,如果还有其他的表,接着注册就可以了
    2 可以快速的对book表进行增删查改操作 
    # 在创建字段的时候如果写上blank=True,默认为False,则在admin中新增数据可以为空,否则如果不设置为True,那么即使null=True,在admin页面中新增数据的时候也会提示数据必须不为空;null=True控制的后端数据库是否可以为空,blank=True控制的前端是否为空,此时在admin写的数据还没有到达后端,是由blank控制的;如果不写null=True,只写blank=True,页面admin页面不会报错,但是数据库会报错;改blank=True不需要对数据库做迁移(也可以,只不过不需要 ),只有在修改跟数据库相关的才需要做迁移
    
  • 相关阅读:
    java项目部署到LIINUX
    JAVA项目部署(1)
    JAVA项目服务器部署
    JAVA项目部署到云服务器
    JAVA项目打包
    java项目部署
    NHibernate NHibernate使用时误区
    访问其他电脑的c盘
    unit vs单元测试
    java 获取url及url参数解析
  • 原文地址:https://www.cnblogs.com/feiguoguobokeyuan/p/13964510.html
Copyright © 2011-2022 走看看