drfday1——入门规范

笔记:

http://www.liuqingzheng.top/python/Django-rest-framework框架/1-drf-drf入门规范/

作业:

1 新建一个图书表,5个符合restful规范的接口,用CBV的APIView实现

# url接口FBV
urlpatterns = [
    url(r'^api/books/', views.Book.as_view()),
]


# 模型表
class Book(models.Model):
    title = models.CharField(max_length=18)
    dec = models.CharField(max_length=255,null=True)
    price = models.IntegerField(null=True)
    author = models.CharField(max_length=18,null=True)
    
# 视图FBV
from django.http import JsonResponse
from rest_framework.views import APIView
from app01 import models
class Book(APIView):
    back_dic = {'msg': ''}
    key_list = ['dec', 'author', 'title', 'price', 'id']
	
    @staticmethod
    def _get_json_list(query_list):  # 传入query对象返回处理好的json数据
        dic_list = []
        for dic in query_list:
            dic_list.append(dic)
        return JsonResponse(dic_list, safe=False)

    @staticmethod
    def _get_params_dic(query_params):  # 传入query对象返回参数字典
        k_v_dic = {}
        for k, v in query_params:
            if k in ('price', 'id'):
                v = int(v)
            k_v_dic[k] = v
        return k_v_dic

    def get(self, request):
        if not request.query_params:  # 没有参数获取所有数据
            book_query = models.Book.objects.all().values()
            return self._get_json_list(book_query)
        query_params = request.query_params.copy().items()
        params_dic = self._get_params_dic(query_params)
        if set(self.key_list) >= set(params_dic.keys()):  # 判断参数包含与字段列表
            book_query = models.Book.objects.filter(**params_dic)  # 判断成功进一步查询
            if book_query:
                book_num = len(book_query)
                if book_num == 1:  # 查询结果为一个直接JsonRespnose返回
                    book_obj = book_query.values().first()
                    return JsonResponse(book_obj)
                book_query_1 = book_query.values()
                return self._get_json_list(book_query_1)  # 查询结果为多个,处理后再返回
            self.back_dic['msg'] = '没有满足条件的书籍')
            return JsonResponse(self.back_dic)  # 查询不到,返回错误信息
        else:
            self.back_dic['msg'] = '查询的条件不合法'
            return JsonResponse(self.back_dic)  # 字段不存在返回错误信息

    def post(self, request):
        if not request.POST:  # 判断是否提交数据 
            self.back_dic['msg'] = '没有提交任何数据'
            return self.back_dic
        query_params = request.POST.copy().items()
        params_dic = self._get_params_dic(query_params)  # 处理上传的数据,返回字典
        if set(self.key_list) >= set(params_dic.keys()):  # 判断数据的字段是否存在
            book_obj = models.Book.objects.create(**params_dic)  # 操作模型表创建数据
            book_obj.__dict__.pop('_state')
            book_dic = book_obj.__dict__
            return JsonResponse(book_dic)  # 返回刚创建记录的在数据库中完整的数据
        self.back_dic['msg'] = '创建的数据字段不合法'  # 提交的数据中有的字段不存在
        return JsonResponse(self.back_dic)

    def delete(self, request):
        if not request.query_params:
            models.Book.objects.all().delete()
            self.back_dic['msg'] = '表中所有的记录已删除'
            return self.back_dic
        query_params = request.query_params.copy().items()
        params_dic = self._get_params_dic(query_params)
        if set(self.key_list) >= set(params_dic.keys()):
            book_obj = models.Book.objects.filter(**params_dic)
            if not book_obj:
                self.back_dic['msg'] = '数据不存在无法删除'
                return JsonResponse(self.back_dic)
            self.back_dic['msg'] = '数据删除成功'
            return JsonResponse(self.back_dic)
        self.back_dic['msg'] = '删除的字段字段不合法'
        return JsonResponse(self.back_dic)

    def put(self, request):
        if not request.query_params:
            self.back_dic['msg'] = '整体:没有查询条件,无法无法获取需要修改的数据'
            return JsonResponse(self.back_dic)
        query_params = request.query_params.copy().items()
        params_dic = self._get_params_dic(query_params)
        if set(self.key_list) >= set(params_dic.keys()):
            update_dic = self._get_params_dic(request.POST.copy().items())
            book_obj = models.Book.objects.filter(**params_dic)
            if not book_obj:
                self.back_dic['msg'] = '整体:没有符合条件的书籍,无法修改'
                return JsonResponse(self.back_dic)
            book_obj.update(**update_dic)
            book_obj = book_obj.values().first()
            return JsonResponse(book_obj)
        else:
            self.back_dic['msg'] = '整体修改:修改字段不合法'
        return JsonResponse(self.back_dic)
	# 跟put一样
    def patch(self, request):
        if not request.query_params:
            self.back_dic['msg'] = '部分:没有查询条件,无法无法获取需要修改的数据'
            return JsonResponse(self.back_dic)
        query_params = request.query_params.copy().items()
        params_dic = self._get_params_dic(query_params)
        if set(self.key_list) > set(params_dic.keys()):
            update_dic = self._get_params_dic(request.POST.copy().items())
            book_obj = models.Book.objects.filter(**params_dic)
            if not book_obj:
                self.back_dic['msg'] = '部分:没有符合条件的书籍,无法修改'
                return JsonResponse(self.back_dic)
            book_obj.update(**update_dic)
            book_obj = book_obj.values().first()
            return JsonResponse(book_obj)
        else:
            self.back_dic['msg'] = '部分修改:修改字段不合法'
        return JsonResponse(self.back_dic)

2 用postman,用django写几个接口,测试,导出文件

用postman对作业一的接口进行测试,做成文件导出,之后测试直接导入使用:

image-20200707215645570

GET

1 http://127.0.0.1:8000/api/books/

image-20200707215739852

2 http://127.0.0.1:8000/api/books/?id=1

image-20200707215831828

3 http://127.0.0.1:8000/api/books/?author=egon

image-20200707215933848

4 http://127.0.0.1:8000/api/books/?id=1&title=三国&price=11&dec=aa&author=egon

image-20200707220034362

POST

1 http://127.0.0.1:8000/api/books/

image-20200707220148303

2

image-20200707220245862

3

image-20200707220310745

DELETE

1 http://127.0.0.1:8000/api/books/?id=1000&title=悟空

image-20200707220437363

2 http://127.0.0.1:8000/api/books/?title=平凡的世界&author=路遥

image-20200707220542845

3 http://127.0.0.1:8000/api/books/ 删出所有数据

PUT
1 http://127.0.0.1:8000/api/books/?id=1

image-20200707220818205

PATCH

1 http://127.0.0.1:8000/api/books/?id=4

image-20200707221006754

后期使用测试导入文件即可:

image-20200707221111800

原文地址:https://www.cnblogs.com/cainiaoqianxun/p/13263641.html