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

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