当前位置:   article > 正文

Django 引入rest_framework框架并实现增删查改_djangorestframework 增删改查

djangorestframework 增删改查

rest_framework框架是基于Django实现的一个RESTful风格的API框架,之前介绍过restful风格,可以参考这篇文章---->传送门

安装

pip install djangorestframework

配置

在installed_apps中注册

INSTALLED_APPS = [
		...,
    'rest_framework',
]
  • 1
  • 2
  • 3
  • 4

在setting.py 配置

REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': (  # 默认响应渲染类
        # 'rest_framework.schemas.AutoSchema',
        'rest_framework.renderers.JSONRenderer',  
        'rest_framework.renderers.BrowsableAPIRenderer'  
    )
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在app中新建serializers.py文件和models.py,views.py同级

在里面定义序列化器

class HrefInfoModelSerializer(serializers.ModelSerializer):
    class Meta:
        model = Href
        fields = '__all__'

    def create(self, validated_data):
        return Href.objects.create(**validated_data)

    def update(self, instance, validated_data):
        instance.name = validated_data.get('name', instance.name)
        instance.url = validated_data.get('url', instance.url)
        instance.save()
        return instance
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

在views.py引入ModelViewSet,从serializers引入我们实现的序列化器

from rest_framework.viewsets import ViewSet, ModelViewSet
from .serializers import HrefInfoModelSerializer
  • 1
  • 2

在views.py实现我们的逻辑处理,rest_framework为我们提供了最基本的增删改查,我们可以自己实现其他的功能,比如单个查询指定的数据。

from rest_framework import serializers
from .models import Href


class HrefViewSet(ModelViewSet):
    parser_classes = [JSONParser, FormParser]
    """视图集"""
    queryset = models.Href.objects.all()
    serializer_class = HrefInfoModelSerializer
    # 搜索
    search_fields = ('id', 'name')

    # 添加链接
    @action(methods=['post'], detail=False)
    @csrf_exempt
    def add_href(self, request, *args, **kwargs):
        name = request.data.get('name', None)
        if name:
            print(name)
            obj = models.Href.objects.filter(name=name).first()
            if obj:
                return JsonResponse({
                    'status': '1001',
                    'msg': '已经存在此链接名称'
                })
            else:
                serializer = HrefInfoModelSerializer(data=request.data)
                if serializer.is_valid():
                    serializer.save()
                    return JsonResponse({
                        'status': '1000',
                        'msg': '添加成功'
                    })
                else:
                    return JsonResponse({
                        'status': '1002',
                        'msg': '插入数据不合法'
                    })
        else:
            return Response(status=status.HTTP_204_NO_CONTENT)
        pass

    # 删除链接
    @action(methods=['delete'], detail=False)
    @csrf_exempt
    def multiple_delete(self, request, *args, **kwargs):
        count = 0
        delete_id = request.data.get('id', None)
        print(delete_id)
        if not delete_id:
            return Response(status=status.HTTP_404_NOT_FOUND)
        for i in delete_id.split(','):
            obj = models.Href.objects.filter(id=i).first()
            if obj:
                obj.delete()
                count = count + 1
            else:
                return Response(status=status.HTTP_204_NO_CONTENT)
        return JsonResponse({
            'code': 200,
            'msg': '删除成功',
            'num': count
        })

    # 获取单个链接信息
    @action(methods=['get'], detail=False)
    @csrf_exempt
    def single_href(self, request, *args, **kwargs):
        query_name = request.data.get('name', None)
        print(query_name)
        if not query_name:
            return Response(status=status.HTTP_404_NOT_FOUND)
        else:
            href = models.Href.objects.all().filter(name=query_name)
            serializer = HrefInfoModelSerializer(instance=href, many=True)
            print(serializer.data)
            return JsonResponse({
                'code': 2010,
                'msg': '查询成功',
                'data': serializer.data
            })

    # 修改信息
    @action(methods=['put'], detail=False)
    @csrf_exempt
    def edit_href(self, request, *args, **kwargs):
        name = request.data.get('name', None)
        if name:
            obj = models.Href.objects.filter(name=name).first()
            serializer = HrefInfoModelSerializer(instance=obj, data=request.data, partial=True)
            if serializer.is_valid():
                serializer.save(update_fields=['name', 'id'])
                return JsonResponse({
                    'code': 200,
                    'msg': '更新成功',
                })
            else:
                return JsonResponse({
                    'code': 201,
                    'msg': '更新失败',
                })
        else:
            return Response(status.HTTP_204_NO_CONTENT)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101
  • 102
  • 103

在urls.py引入路径,rest_framework提供了路径匹配SimpleRouter,我们不需要一点一点的书写path了

from rest_framework.routers import DefaultRouter, SimpleRouter

urlpatterns = [ 
					] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)

router = SimpleRouter()
router.register(r'href', views.HrefViewSet)  # 注册路由
urlpatterns += router.urls  # 把生成好的路由拼接到urlpatterns
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

GET

在这里插入图片描述

POST

我们使用postman来进行post以及其他请求
在这里插入图片描述

可以看到数据已经插入数据库中。
在这里插入图片描述

PUT

修改数据
在这里插入图片描述

可以看出数据已经被修改为localhost
在这里插入图片描述

DELETE

在这里插入图片描述

可以看到数据库中id为52的数据已经被删除
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/437107
推荐阅读
相关标签
  

闽ICP备14008679号