Django3.0 API接口开发

1. 模型的创建

创建模型用于测试,设计一张简单的数据表存放在Pycharm自带的sqlite数据库中:

models.py

from django.db import models

# Create your models here.
class User(models.Model):
    name = models.CharField(max_length=12)
    register_date = models.DateTimeField(auto_now_add=True, null=True)  # 如果设置为自动设置时间,要添加可以为空,默认是不为空的

生成数据表:

(DjangoAPI) thanlon@thanlon:~/PycharmProjects/DjangoAPI$ python manage.py makemigrations
(DjangoAPI) thanlon@thanlon:~/PycharmProjects/DjangoAPI$ python manage.py migrate
2. 路由系统的创建

添加和查询信息使用的路由是 user/,修改(更新)和删除信息使用路由是 user/<int:pk>/,路由创建如下:

urls.py:

from django.contrib import admin
from django.urls import path
from app import views

urlpatterns = [
    path('admin/', admin.site.urls),
    path('user/', views.UserView.as_view()),
    path('user/<int:pk>/', views.UserDetail.as_view()),
]
3. 添加数据的接口

添加数据的业务逻辑:

views.py:

class UserView(View):
    def post(self, request):
        """
        增加数据
        :param request:
        :return:
        """
        # request.POST中是没有数据的,需要在body中获取,但是需要先将bytes->符串->反序列化转化成列表对象
        form = UserForm(None, json.loads(request.body.decode()))
        if form.is_valid():
            instance = form.save()
            ret = {
                'status': 0,
                'data': instance.pk
            }
            return JsonResponse(ret)
        else:
            ret = {
                'status': 1,
                'data': form.errors
            }
            return JsonResponse(ret)

数据验证:

user_form.py:

from django import forms
from .. import models

class UserForm(forms.Form):
    name = forms.CharField(max_length=10)

    def __init__(self, instence=None, *args, **kwargs):  # 函数传参不要使用可变类型
        self.instence = instence
        super(UserForm, self).__init__(*args, **kwargs)  # 原封不动传过去,这样就可以多传递一个值

    def save(self):
        if self.instence:
            # 通过反射设置新值,不能直接self.instence.name='thanlon'
            # print(self.cleaned_data)
            for k, v in self.cleaned_data.items():
                setattr(self.instence, k, v)
            self.instence.save()
            return self.instence # 更新instence
            # 如果没有数据。校验通过的数据全部放在cleaned_data中,key value组成的字典:{'name': 'thanlon'}
        return models.User.objects.create(**self.cleaned_data)

添加和修改数据,因为需要有数据传入后台,所以需要对数据进行验证。查询所有数据因为不传入后台任何数据,也无须验证。查询单条数据和删除数据需要进行验证,但不是Form验证,使用路由匹配进行验证!

Postman向后台发送添加数据的POST请求,返回的状态码是0,说明添加成功:
在这里插入图片描述
验证数据库,已经添加完成:
在这里插入图片描述

4. 获取所有数据的接口

获取所有数据的业务逻辑:

class UserView(View):
    def get(self, request):
        """
        查询(所有数据)
        :param request:
        :return:
        """
        query_set = models.User.objects.values('name')  # <QuerySet [{'name': 'Erics'}]>
        ret = {
            'status': 0,
            'data': list(query_set)  # 转换成列表,[{'name': 'Erics'}]
        }
        return JsonResponse(ret)

Postman向后台发送获取所有数据的GET请求,返回的状态码是0,说明查询数据成功:
在这里插入图片描述

5. 获取单条数据的接口

获取单条数据的业务逻辑,走的路由是 /user/<int:pk>/

views.py:

class UserDetail(View):
    def get(self, request, pk):
        """
        查询单条数据
        :param request:
        :param pk:
        :return:
        """
        # instence = models.User.objects.filter(pk=pk)
        # print(instence)  # <QuerySet [<User: User object (1)>]>
        instence = models.User.objects.filter(pk=pk).first()
        print(instence)  # User object (1)
        ret = {
            'status': 0,
            'data': {
                'name': instence.name
            }
        }
        return JsonResponse(ret)

Postman向后台发送查询单条数据的GET请求,返回的状态码是0,说明添加成功:
在这里插入图片描述

6. 更新数据的接口

更新数据的业务逻辑:

class UserDetail(View):
    def put(self, request, pk):
        """
        修改数据。restful规定更新数据,用put或者patch,put用得多一些
        :param request:
        :return:
        """
        instence = models.User.objects.filter(pk=pk).first()
        if not instence:
            ret = {
                'status': 1,
                'data': {
                    'name': '数据不存在'
                }
            }
            return JsonResponse(ret)
        # 借助form来修改(form中有新数据),降低了耦合度
        form = UserForm(instence, json.loads(request.body.decode()))
        if form.is_valid():
            instence = form.save()  # instence不更新也是可以的,还是查找到的和要修改的id是一样的
            ret = {
                'status': 0,
                'data': instence.pk
            }
            return JsonResponse(ret)
        else:
            ret = {
                'status': 1,
                'data': form.errors
            }
            return JsonResponse(ret)

数据的验证:

user_form.py:

from django import forms
from .. import models

class UserForm(forms.Form):
    name = forms.CharField(max_length=10)

    def __init__(self, instence=None, *args, **kwargs):  # 函数传参不要使用可变类型
        self.instence = instence
        super(UserForm, self).__init__(*args, **kwargs)  # 原封不动传过去,这样就可以多传递一个值

    def save(self):
        if self.instence:
            # 通过反射设置新值,不能直接self.instence.name='thanlon'
            # print(self.cleaned_data)
            for k, v in self.cleaned_data.items():
                setattr(self.instence, k, v)
            self.instence.save()
            return self.instence # 更新instence
            # 如果没有数据。校验通过的数据全部放在cleaned_data中,key value组成的字典:{'name': 'thanlon'}
        return models.User.objects.create(**self.cleaned_data)

Postman向后台发送更新数据的PUT请求,返回的状态码是0,说明修改成功:
在这里插入图片描述

7. 删除数据的接口

删除数据的业务逻辑:

views.py:

class UserDetail(View):
    def delete(self, request, pk):
        """
        删除数据(删除单条数据)
        :param request:
        :param pk:
        :return:
        """
        models.User.objects.filter(pk=pk).delete()
        ret = {
            'status': 0,
            'data': []
        }
        return JsonResponse(ret)

user_form.py:

class UserForm(forms.Form):
    name = forms.CharField(max_length=10)

    def __init__(self, instence=None, *args, **kwargs):  # 函数传参不要使用可变类型
        self.instence = instence
        super(UserForm, self).__init__(*args, **kwargs)  # 原封不动传过去,这样就可以多传递一个值

    def save(self):
        if self.instence:
            # 通过反射设置新值,不能直接self.instence.name='thanlon'
            # print(self.cleaned_data)
            for k, v in self.cleaned_data.items():
                setattr(self.instence, k, v)
            self.instence.save()
            return self.instence # 更新instence
            # 如果没有数据。校验通过的数据全部放在cleaned_data中,key value组成的字典:{'name': 'thanlon'}
        return models.User.objects.create(**self.cleaned_data)

Postman向后台发送添加数据的 DELETE请求,返回的状态码是0,说明删除成功:
在这里插入图片描述

Githubhttps://github.com/ThanlonSmith/django-api

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章