Django总结(待续)

Posted bjlxxbj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Django总结(待续)相关的知识,希望对你有一定的参考价值。

Django

命令行使用

? 创建django项目
? django-admin startproject mysite
? 启动django项目
? python manage.py runserver
? 创建应用app
? python manage.py startapp app01
?

注意:
1.新创建的app需要你去settings配置文件中注册
2.pycharm只会帮你注册第一个你在创建项目的时候写的应用
3.使用命令行创建django项目 不会自动帮你创建templates文件夹 只能自己创建
4.settings文件中 需要你手动在TEMPLATES写配置os.path.join(BASE_DIR, ‘templates‘)

HTTP(超文本传输协议)

? 请求格式
? 请求首行(请求方式,协议版本。。。)
? 请求头(一大堆k:v键值对)
?
? 请求体(真正的数据 发post请求的时候才有 如果是get请求不会有)

? 响应状态码
? 用特定的数字表示一些意思
? 1XX:服务端已经成功接收到了你的数据 正在处理 你可以继续提交其他数据
? 2XX:服务端成功响应(200请求成功)
? 3XX:重定向
? 4XX:请求错误(404 请求资源不存在 403 拒绝访问)
? 5XX:服务器内部错误(500 )

? 请求方式
? get请求
? 朝别人要数据
? post请求
? 向别人提交数据(eg:用户登录)

wsgire模块( web服务网关接口)

1 socket代码帮你封装好了
2 http数据自动帮你处理好了
1.请求来的时候 帮你拆分http数据格式
2.响应走的时候 有帮你封装成了符合http数据格式的数据

动静态网页

1.将后端获取到的时间传递给前端页面
利用字符串的替换 实现数据传递
2.将字典传递给前端页面 并且可以很方便的操作
借助于jinja2模块实现模板的渲染
from jinja2 import Template
temp = Template(data)
res = temp.render(user={‘name‘:‘jason‘})

模板语法

什么是模板:只要是在html里面有模板语法就不是html文件了,这样的文件就叫做模板。

模板的渲染:后端获取的数据 传递给html页面

在 Django 模板中遍历复杂数据结构的关键是句点字符 .(也就是点)

? 注意:句点符也可以用来引用对象的方法(无参数方法)。

模板之语法符号:{{}} 变量相关,{%%} 逻辑相关

**模板之过滤器:语法 {{obj|filter__name:param}}**

小白必会三板斧+json格式数据

from django.shortcuts import render,HttpResponse,redirect
HttpResponse # 返回字符串的
render # 返回一个html页面 还可以给模板传递
redirect # 重定向

JsonResponse # 返回json格式数据的
? 前后端分离 就是基于json格式传输数据
? 后端就专门写接口 前端调用你这个接口 就能够拿到一个json格式的字符串
? 然后前端利用序列化反序列转换成前端对应的数据类型

? 前端 后端

JSON.stringify 序列化 >>> json.dumps

JSON.parse 反序列 >>> json.loads

静态文件

网站所用到的
自己写好js
自己写好css
第三方的框架 bootstrap fontwesome sweetalert

静态文件配置

通常情况下 网站所用到的静态文件资源 统一都放在static文件夹下
STATIC_URL = ‘/static/‘ # 是访问静态资源的接口前缀
只要你想访问静态资源 你就必须以static开头

手动配置静态文件访问资源

STATICFILES_DIRS = [
os.path.join(BASE_DIR,‘static‘),]

接口前缀 动态解析

{% load static %}

form表单

action参数可以写的形式
1.不写 默认朝当前地址提交
2.只写后缀/index/
3.写全路径

form表单默认朝后端提交的方式 默认是get请求
get请求携带参数的方式 是在url后面?
url?username=admin&password=123
缺点
1.不安全
2.get请求携带的参数有大小限制(最大不能超过4KB左右)

form表单上传文件

注意事项(上传文件
1.提交方式必须是post
2.enctype参数必须有默认的urlencoded变成formdata

request对象及方法

前后端数据交互,获取请求方式

获取post请求携带的数据
request.POST
获取get请求携带的数据
request.GET

request.POST.get(‘username‘) 默认只取列表的最后一个元素,如果想将列表完整取出 要用getlist()

Django连接mysql

第一步配置文件中配置
DATABASES = {
‘default‘: {
‘ENGINE‘: ‘django.db.backends.mysql‘, # 指定数据库 MySQL postgreSQL
‘NAME‘: ‘demo‘, # 到底使用哪个数据库
‘USER‘:‘root‘,
‘PASSWORD‘:‘root‘,
‘HOST‘:‘127.0.0.1‘,
‘PORT‘:3306,
‘CHARSET‘:‘utf8‘
}
}

第二步
django默认使用的是mysql db连接数据库 但是该模块不支持了
所以你要告诉django不要用mysqldb该用pymysql连接

你可以在项目名下面的__init__.py也可以在应用名下面的__init__.py文件中指定
import pymysql
pymysql.install_as_MySQLdb()     

然后可以在test.py文件夹中写下列代码:

import os
if __name__ == "__main__":
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "untitled12.settings")
    import django
    django.setup()

就可以测试mysql代码了

Django表的创建

django的orm不会自动帮你创建库,库需要你自己手动创建,表会自动帮你创建 你只需要书写符合django orm语法的代码即可

去应用下所在的models.py中书写类
from django.db import models

# Create your models here.
class Userinfo(models.Model):
    # 设置id字段为userinfo表的主键  id int primary key auto_increment
    id = models.AutoField(primary_key=True)  # 在django中 你可以不指定主键字段 django orm会自动给你当前表新建一个名为id的主键字段
    # 设置username字段  username varchar(64)  CharField必须要指定max_length参数
    username = models.CharField(max_length=64)  # 在django orm中 没有char字段  但是django 暴露给用户 可以自定义char字段
    # 设置password字段  password int
    password = models.IntegerField()
    
    
******************************数据库迁移(同步)命令***********************************    
python manage.py makemigrations  # 不会创建表 仅仅是生成一个记录  将你当前的操作记录到一个小本本上(migrations文件夹)
python manage.py migrate  # 将你的orm语句真正的迁移到(同步)到数据库中

只要你在models.py中修改了跟数据库相关的代码 你就必须重新开始执行上面两条命令

数据的增删改查

后端如何获取前端用户想要编辑的数据对象

利用get请求url后面可以携带参数的方式 将数据的主键值传递给后端

编辑功能的思路:获取用户想要编辑的数据对象 展示到前端页面 用户修改之后点击修改 再去修改数据库中对应的数据

get() :
1.条件存在的情况下 获取的直接是数据对象本身
2.条件不存在的情况下 会直接报错 所以不推荐你使用get方法查询数据

filter():

? 1.条件存在的情况下 获取到的是一个可以看成列表的数据 列表里面放的才是一个个数据对象本身
? 2.条件不存在的情况下 并不会报错 返回的是一个可以看成空列表的数据
? 3.filter括号内可以写多个参数逗号隔开 这多个参数在查询的时候 是and关系
4.filter的结果支持索引取值 但是不支持负数 并且不推荐你使用索引 推荐你使用它封装好的方法 first取第一个数据对象

all() :

? res = models.表名.objects.all() 查所有数据

1.create():models.表名.objects.create(id="")
? 1.括号内些关键字参数的形式 创建数据
? 2.该方法会有一个返回值 返回值就是当前对象本身
2.利用对象点方法的方式
? user_obj = models.User(**kwargs)
? user_obj.save() # 将当前对象保存到数据库中

1.update()
models.Userinfo.objects.filter(**kwargs).update() # 批量更新

2.(不推荐使用 效率极低 会将每一个字段对应的值全部重写一遍)
edit_obj = models.Userinfo.objects.filter(pk=edit_id).first() # pk会自动帮你查找当前表的主键字段
edit_obj.username = username
edit_obj.save()

models.Userinfo.objects.filter(pk=delete_id).delete()
说真正的数据是不会被删除的 通常都是给数据设置一个是否删除的标志位

反向解析

根据某一个东西 动态解析出一个结果 该结果可以直接访问对应的url

url(r'^test_add/', views.testadd,name='xxx')
前端解析
    {% url 'xxx' %}
后端解析
    from django.shortcuts import render,HttpResponse,redirect,reverse
    url = reverse('xxx')

模板的继承

事先需要在模板中 通过block划定区域

          {% block 区域名字 %}
          {% endblock %}
    子板中如何使用
            {% extends '模板的名字'%}
            
            {% block 区域名字 %}
            {% endblock %}
                    
    一个页面上 block块越多 页面的扩展性越高
    通常情况下 都应该有三片区域
            {% block css %}
            {% endblock %}
            
            {% block content %}
            {% endblock %}
            
            {% block js %}
            {% endblock %}
    
    子板中还可以通过
        {{ block.super }}  来继续使用母版的内容

?

模板的导入

当你写了一个特别好看的form表单 你想再多个页面上都使用这个form表单
你就可以将你写的form表单当作模块的形式导入 导入过来之后 就可以直接展示

    {% include 'xxx.html' %}

?

单表查询

   只要是queryset对象 就可以无限制的点击queryset对象的方法
   1.单表查询必知必会13条
     1.all()  # 查所有
        2.filter()  # 根据条件过滤 多个条件之间是and关系
        3.get()  # 直接获取数据对象  查询条件不存在直接报错
        4.first()  # 取queryset的第一个数据对象
        5.last()  # 取queryset的最后一个数据对象
        6.exclude()  # 除此之外 
        7.values()  # queryset 类似于列表套字典
        8.values_list()  # queryset 类似于列表套元组
        9.count()  # 统计数据个数
        10.distinct()  # 一定要是完全一样的数据才能去重
        11.order_by()  # 排序 默认是升序 加负号就变成降序
        12.reverse()  # 反转 排序之后才能反转
        13.exists()  # 判断queryset是否有值 结果是个布尔值
    2.神奇的双下划线查询
        price__gt 大于
        price__lt 小于
        price__gte 大于等于
        price__lte 小于等于
        price__in=[100,200,300] 100或者200或者300
        price__range=(200,800) 在200到8000之间(顾头不顾尾)
        title__contains  包含  模糊匹配
        title__icontains  忽略大小写
        publish_date__year  只针对年份
        publish_date__month  只针对月份
        title__startswith 以什么开始
        title__endswith 以什么结束
   

?

多表查询

多表查询
    前期表准备
        图书管理系统
            一对多
            多对多
            一对一
        
    外键字段的增删改查
        一对多字段
            create(publish_id=1)
            create(publish=publish_obj)
            
            update(publish_id=2)
            update(publish=publish_obj1)
            
            models.Publish.objects.filter(pk=2).delete()
            # orm外键默认是级联更新 级联删除的
        
        多对多字段
            # 朝第三张关系表中添加数据
            book_obj.authors.add(1)
            book_obj.authors.add(1,2,3,4)
            book_obj.authors.add(author_obj)
            book_obj.authors.add(author_obj,author_obj1,author_obj2)
            # 朝第三张表修改数据
            book_obj.authors.set((1,))
            book_obj.authors.set((1,2,3))
            book_obj.authors.set((author_obj,))
            book_obj.authors.set((author_obj,author_obj1))
            # 朝第三张表删除关系
            book_obj.authors.remove(1)
            book_obj.authors.remove(1,2,3,4)
            book_obj.authors.remove(author_obj)
            book_obj.authors.remove(author_obj,author_obj1)
            # 朝第三张表清空当前书籍对象所有的记录
            book_obj.authors.clear()
            
    跨表查询
        正反向的概念:
            外键字段在谁那儿 谁就是正向
            没有外键字段的  就是反向
    口诀:
            正向查询按字段
            反向查询按表名小写

聚合查询

聚合函数
from django.db.models import Max,Min,Sum,Count,Avg

查询优化

查询优化(面试比较喜欢问的)
only与defer

select_related和prefetch_related

创建事务

from django.db import transaction
with transaction.atomic():

在该代码块中所写的orm语句 同属于一个事务

缩进出来之后自动结束

以上是关于Django总结(待续)的主要内容,如果未能解决你的问题,请参考以下文章

接口继承与多态 总结(未完待续)

javascript有用小功能总结(未完待续)

数论模板总结 -- 未完待续

如何在 Django Summernote 中显示编程片段的代码块?

CSS写作建议和性能优化总结(未完待续)

flink技术总结待续