zoukankan      html  css  js  c++  java
  • 图书管理02 View实现

    1.模型models.py

    from django.db import models
    
    # Create your models here.
    class BookInfo(models.Model):
        title = models.CharField(max_length=20, verbose_name='名称')
        pub_date = models.DateField(verbose_name='发布日期')
        desc = models.TextField('简介')
        read = models.IntegerField(default=0, verbose_name='阅读量')
        is_delete = models.BooleanField(default=False, verbose_name='逻辑删除')
    
        class Meta:
            db_table = 'tb_books04'  # 指明数据库表名
            verbose_name = '图书'  # 在admin站点中显示的名称
            verbose_name_plural = verbose_name  # 显示的复数名称
    
        def __str__(self):
            """定义每个数据对象的显示信息"""
            return self.title
    models.py

    2.视图 views.py

    from django.http import JsonResponse
    from django.views import View
    import datetime
    from .models import *
    import json
    import copy
    
    
    # Create your views here.
    
    
    # 查询单个
    class BookView(View):
        def get(self, request, pk=None):
            if pk:
                try:
                    book = BookInfo.objects.get(id=pk)
                except Exception as e:
                    return JsonResponse({'code': 999, 'msg': 'pk不存在'})
                book_data = {
                    'id': book.id,
                    'title': book.title,
                    'pub_date': book.pub_date,
                    'read': book.read,
                    'desc': book.desc
                }
                return JsonResponse(book_data)
            else:
                get_dict = copy.copy(request.GET)
                filter_fields = ('title', 'desc')
                query_set = BookInfo.objects.filter(is_delete=False)
                for k, v in get_dict.items():
                    if k in filter_fields:
                        query_set = query_set.filter(**{k: v})
                    else:
                        return JsonResponse({'code': 999, 'msg': '不允许使用%s字段过滤' % k})
            book_list = []
            for i in query_set:
                book_data = {
                    'id': i.id,
                    'title': i.title,
                    'pub_date': i.pub_date,
                    'read': i.read,
                    'desc': i.desc
                }
                book_list.append(book_data)
            return JsonResponse(book_list, safe=False)
    
        def post(self, request):
            data = json.loads(request.body.decode())
            title = data.get('title', None)
            pub_date = data.get('pub_date', None)
            read = data.get('read', 0)
            desc = data.get('desc', None)
            if all([title, pub_date, desc]):
                pass
            else:
                return JsonResponse({'msg': '参数不足'})
            if str(read).isdigit():
                pass
            else:
                return JsonResponse({'msg': 'read类型不正确'})
            try:
                datetime.datetime.strptime(pub_date, '%Y-%m-%d')
            except Exception as e:
                return JsonResponse({'msg': '日期格式有误,请使用"YYYY-MM-DD"格式'})
            book = BookInfo(
                title=title,
                pub_date=pub_date,
                read=read,
                desc=desc
            )
            book.save()
            return JsonResponse({
                'id': book.id,
                'title': book.title,
                'pub_date': book.pub_date,
                'read': book.read,
                'desc': book.desc
            }, status=201)
    
        def delete(self, request, pk):
            if pk:
                try:
                    book = BookInfo.objects.get(id=pk)
                    book.is_delete = True
                    book.save()
                    return JsonResponse({}, status=204)
                except Exception as e:
                    return JsonResponse({'code': 999, 'msg': 'pk不存在'})
    
        def put(self, request, pk):
            data = json.loads(request.body.decode())
            title = data.get('title', None)
            if pk:
                try:
                    book = BookInfo.objects.get(id=pk)
                    book.title = title
                    book.save()
                    book_data = {
                        'id': book.id,
                        'title': book.title,
                        'pub_date': book.pub_date,
                        'read': book.read,
                        'desc': book.desc
                    }
                    return JsonResponse(book_data)
                except Exception as e:
                    return JsonResponse({'code': 999, 'msg': 'pk不存在'})
    
    
    class BooksView(View):
        def get(self, request):
            queryset = BookInfo.objects.filter(is_delete=True)
            book_list = []
            for i in queryset:
                book_data = {
                    'id': i.id,
                    'title': i.title,
                    'pub_date': i.pub_date,
                    'read': i.read,
                    'desc': i.desc
                }
                book_list.append(book_data)
            return JsonResponse(book_list, safe=False)
    views.py

    3.路径 urls.py

    from django.urls import path,include
    from app04.views import *
    
    urlpatterns = [
        path('books/', BookView.as_view()),  #post
        path('books/is_del/', BooksView.as_view()), # 删除图书
        path('books/<int:pk>/', BookView.as_view()), #get,delete,put
    ]
    urls.py

    测试

    import requests
    import json
    
    headers = {'Content-Type': 'application/json;charset=UTF-8'}
    data = {"title": "天龙八部", "desc": "武侠小说", "pub_date": "2020-12-12", "read": "100"}
    pk = 0
    
    
    # 创建 天龙八部
    def post(url):
        global pk
        try:
            resp = requests.post(url, data=json.dumps(data), headers=headers, timeout=2)
        except requests.exceptions.ConnectTimeout as e:
            raise Exception('post:%s, 请求超时' % url)
        except Exception as e:
            raise Exception('post:%s, 请求失败' % url)
        if resp.status_code == 201:
            pass
        else:
            raise Exception('post:%s,响应码不是201' % url)
        try:
            resp_data = json.loads(resp.text)
        except Exception as e:
            raise Exception('post:%s, 响应体json.loads失败' % url)
    
        try:
            pk = resp_data['id']
        except Exception as e:
            raise Exception('post:%s, 创建图书没有返回id'%url)
        for k in data:
            try:
                d = resp_data[k]
            except Exception as e:
                raise Exception('post:%s, 没有返回%s键' % (url,k))
            if d == data[k]:
                pass
            else:
                raise Exception('post:%s, %s键,创建数据不正确' % (url,k))
    
    
    # 查询 天龙八部
    def search(url):
        params = {'title': '天龙八部'}
        try:
            resp = requests.get(url, params={'title': '天龙八部'})
        except Exception as e:
            raise Exception('search:%s, 请求失败' % url)
    
        if resp.status_code == 200:
            pass
        else:
            raise Exception('请求失败, 响应码不是200')
    
        try:
            resp_data = json.loads(resp.text)
        except Exception as e:
            raise Exception('post:%s, 响应体json.loads失败' % url)
    
        for r in resp_data:
            try:
                d = r['title']
            except Exception as e:
                raise Exception('没有返回"title"键')
    
            if d == params['title']:
                pass
            else:
                raise Exception('根据title查询图书,返回值title不正确')
    
    
    # 查询 天龙八部
    def get(url, pk):
        try:
            resp = requests.get(url + str(pk) + '/')
        except Exception as e:
            raise Exception('get_pk:%s, 请求失败' % url)
    
        if resp.status_code == 200:
            pass
        else:
            raise Exception('请求失败, 响应码不是200')
    
        try:
            resp_data = json.loads(resp.text)
        except Exception as e:
            raise Exception('返回数据不能解析成json')
    
        try:
            if resp_data['id'] == pk:
                pass
            else:
                raise Exception('获取单个图书失败')
        except Exception as e:
            raise Exception('id获取失败')
    
    
    def put(url, pk):
        new_data = {'title': '天龙八部后传'}
        try:
            resp = requests.put(url + str(pk) + '/', data=json.dumps(new_data), headers=headers)
        except Exception as e:
            raise Exception('put:%s, 请求失败' % url)
    
        if resp.status_code == 200:
            pass
        else:
            raise Exception('请求失败, 响应码不是200')
    
        try:
            resp_data = json.loads(resp.text)
        except Exception as e:
            raise Exception('返回数据不能解析成json')
    
        try:
            d = resp_data['title']
        except Exception as e:
            raise Exception('数据没有返回title')
    
        if d == new_data['title']:
            pass
        else:
            raise Exception('修改title失败')
    
    
    def delete(url, pk):
        try:
            resp = requests.delete(url + str(pk) + '/')
        except Exception as e:
            raise Exception('delete:%s, 请求失败' % url)
    
        if resp.status_code == 204:
            pass
        else:
            raise Exception('删除status_code不是204')
    
    
    if __name__ == '__main__':
        ips = [
            '192.168.0.252', #本机
        ]
        for ip in ips:
            try:
                url = 'http://%s:8000/books/' % ip
                print(url)
                post(url)
                get(url, pk)
                search(url)
                put(url, pk)
                delete(url, pk)
            except Exception as e:
                print(e)
                continue
    test2
  • 相关阅读:
    Smali语法
    css 实现垂直水平居中常用方法
    css border实现三角形
    vue-router学习笔记
    vuex状态管理
    es6 reduce的用法
    vue学习笔记
    chrome调式工具
    前端需要了解的http知识
    underscore.js and moment.js
  • 原文地址:https://www.cnblogs.com/xiaoxiamiaichiyu/p/14175098.html
Copyright © 2011-2022 走看看