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总结(待续)的主要内容,如果未能解决你的问题,请参考以下文章