【django】-数据库操作&上下文管理器&中间件
0、子应用
- 子应用目录结构
- 配置子应用
1、创建表
- 创建模型:models.py
1 from django.db import models 2 3 # Create your models here. 4 5 class Category(models.Model): 6 # 默认表名为appname_classname 7 name = models.CharField(verbose_name='分类名称',max_length=20,unique=True) 8 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True) 9 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True) 10 11 class Meta: 12 db_table = 'category' #创建表的表名 13 verbose_name = '分类' 14 verbose_name_plural = verbose_name 15 ordering = ['-create_time','name'] 16 17 def __str__(self): 18 return self.name
1 class Article(models.Model): 2 title = models.CharField(verbose_name='标题',max_length=25) #varchar 3 content = models.TextField(verbose_name='文章内容') 4 img = models.ImageField(upload_to='article',blank=True) 5 # db_constraint = Fasle,不会真的创建外键关联 6 category = models.ForeignKey(Category,on_delete=models.DO_NOTHING,db_constraint=False,verbose_name='分类') 7 create_time = models.DateTimeField(verbose_name='创建时间',auto_now_add=True) 8 update_time = models.DateTimeField(verbose_name='修改时间',auto_now=True) 9 10 class Meta: 11 db_table = 'article' #创建表的表名 12 verbose_name = '文章' 13 verbose_name_plural = verbose_name 14 ordering = ['-create_time'] 15 16 def __str__(self): 17 return self.title
- 生成表
- 生成表结构:python3 manage.py makemigrations
- 同步表结构到数据库:python3 manage.py migrate
2、表操作:增删改查;test.py
- 分类
from django.test import TestCase import os,django # Create your tests here. #设置django的配置文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings') django.setup() from user import models #增加 # 方式一 category = models.Category(name='Python') category.save() # 方式二 models.Category.objects.create(name='Jmeter') models.Category.objects.create(name='Vue') models.Category.objects.create(name='Postman') #查询 # 只能返回一条数据,返回多条会报错 # 如果指定的条件未匹配成功,也会报错 c1 = models.Category.objects.get(id=1) print(c1.name) print(c1.id) # 返回的是一个list query_set = models.Category.objects.filter(name='Python',id=1) print(query_set) c = query_set.first() c1 = query_set[0] print(c.name) print(c1.name) from django.test import TestCase import os,django # Create your tests here. #设置django的配置文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings') django.setup() from user import models #删除 # 方式一:单个删除 c1 = models.Category.objects.get(id=1) c1.delete() # 方式二:批量删除 q = models.Category.objects.filter(name='python1') q.delete() #修改 # 方式一:单个修改 c1 = models.Category.objects.get(id=2) c1.name='Java' c1.save() # 方式二:批量修改 q = models.Category.objects.filter(name='Python') q.update(name='python1')
- 文章
- 已有分类
- 创建文章
from django.test import TestCase import os,django # Create your tests here. #设置django的配置文件 os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'sky.settings') django.setup() from user import models #增加文章 c1 = models.Category.objects.get(id=2) a1 = models.Article.objects.create(title='Jmeter',content='参数化',category=c1) a1.save() a2 = models.Article.objects.create(title='Java',content='sprint boot项目 hello world!!',category_id=4) a2.save() #查询某个分类下的所有文章 c_obj = models.Category.objects.get(name='Jmeter') print(c_obj) #方法一:手动通过分类查询文章 num = models.Article.objects.filter(category=c_obj) print(num) #方法二:一对多的时候,通过1,反查多 print(c_obj.article_set.all())
3、通过web页面请求创建文章
- 项目结构
- 编写views.py
from django.http import HttpResponseRedirect from django.shortcuts import render,HttpResponse from . import models def article(request): print(request.method) # 请求方式 print(request.GET) # 通过url传参的方式,通过该方式获取请求值 print(request.POST) # 获取请求值 print(request.COOKIES) print(request.path_info) # 请求的路径 /post /cate print(request.FILES) # 获取文件 print(request.META) # 请求头相关的都在这里 print(request.body) # body里面的内容 #创建文章 if request.method=='GET': return render(request,'post.html') else: title = request.POST.get('title') content = request.POST.get('content') category = request.POST.get('category') models.Article.objects.create(title=title,content=content,category_id=category) return HttpResponseRedirect('/')
- 配置urls.py
from django.contrib import admin from django.urls import path from user import views urlpatterns = [ path('admin/', admin.site.urls), path('index',views.user_info), path('welcome',views.welcome), path('',views.index), path('category/<int:id>',views.category), path('post',views.article) # 创建文章 ]
- 模板文件:post.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="post" method="post"> {#django默认启用了csrf验证#} {% csrf_token %} <h1>写文章的</h1> <div> title:<input type="text" name="title"> </div> <div> content:<input type="text" name="content"> </div> <div> <select name="category"> {% for category in categories %} <option value="{{ category.id }}">{{ category.name }}</option> {% endfor %} </select> </div> <div> <input type="submit" value="提交"> </div> </form> </body> </html>
4、前端公共部分,复用
- base.html
- category.html
5、后端公共部分,复用:上下文管理器(如果每个view都需要返回同样的数据,那么就可以考虑使用上下文管理器;可写多个)
- 查询某个分类下的所有文章(页面右边需显示所有分类)
- 分类业务处理:views.py、urls.py
-
from django.http import HttpResponseRedirect from django.shortcuts import render,HttpResponse from . import models def category(request,id): #只返回了某个分类,分类页面显示的文章分类列表为公共部分,通过上下文管理器处理获得 category_obj = models.Category.objects.get(id=id) articles = models.Article.objects.filter(category=category_obj) return render(request,'category.html',{'articles':articles,'category_obj':category_obj})
from django.contrib import admin from django.urls import path from user import views urlpatterns = [ path('admin/', admin.site.urls), path('index',views.user_info), path('welcome',views.welcome), path('',views.index), path('category/<int:id>',views.category), #查询分类下的所有文章 path('post',views.article) ]
- 创建&配置上下文管理器
- 创建
-
- 代码如下
from . import models def process_category(request): print('上下文处理器') categories = models.Category.objects.all() return {'categories':categories}
- 配置
- 请求流程图
- 代码如下
6、中间件
- 应用:可利用实现mock接口平台开发
- models.py
# mock平台开发 class Interface(models.Model): name = models.CharField(verbose_name='接口名称',max_length=50) path = models.CharField(verbose_name='接口路径',max_length=60,unique=True) response = models.TextField(verbose_name='返回数据') class Meta: db_table = 'interface' verbose_name = '接口' verbose_name_plural = verbose_name def __str__(self): return self.name
- middle_wares.py
from django.http import HttpResponse from django.middleware.common import MiddlewareMixin from . import models class TestMiddleWare(MiddlewareMixin): def process_request(self,request): # 请求过来之后先走到这里 # 利用中间件实现mock接口平台开发 print('request...') path = request.path_info interface = models.Interface.objects.filter(path=path).first() # print(interface) if interface: return HttpResponse(interface.response) # print(request.META) def process_response(self,request,response): # 拦截返回的 print('response...') return response def process_exception(self,request,exception): # 拦截异常的 print('出异常了') return HttpResponse("努力抢救中!")
- 配置
- 请求示例
- 已有接口
-
- 请求
7、django自带的admin管理系统
- 创建用户命令:python3 manage.py createsuperuser
- 编写admin.py
from django.contrib import admin # Register your models here. from . import models class ArticleAdmin(admin.ModelAdmin): list_per_page = 10 #每页最多展示多少条数据 list_display = ['id','title','img','create_time'] #展示哪些字段 list_filter = ['category'] #按照哪些字段来筛选 search_fields = ['title','content'] class CategoryAdmin(admin.ModelAdmin): list_per_page = 10 # 每页最多展示多少条数据 list_display = ['id', 'name', 'create_time'] # 展示哪些字段 list_filter = ['name'] # 按照哪些字段来筛选 search_fields = ['name'] class InterfaceAdmin(admin.ModelAdmin): list_per_page = 10 #每页最多展示多少条数据 list_display = ['id','name'] #展示哪些字段 search_fields = ['name'] admin.site.register(models.Article,ArticleAdmin) admin.site.register(models.Category,CategoryAdmin) admin.site.register(models.WebSite), admin.site.register(models.Interface,InterfaceAdmin)
- 登录:http://127.0.0.1:8000/admin/
- 问题:已解决
- 升级:pip install django==2.1.7
- pip3 install Django –upgrade
- 查看Django版本: python3 -m django --version
- 删除已有数据库
-
- 重新生成:
- python3 manage.py makemigrations
- python3 manage.py migrate
- python3 manage.py createsuperuser
- 重新生成: