【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

 

posted @ 2020-08-23 22:33  tour8  阅读(212)  评论(0编辑  收藏  举报