Django框架restful序列化get/post/delete/put請求接口設計(高級版)


先上models.py文件內容

from django.db import models


# 作者表
class Author(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    age = models.IntegerField()

    def __str__(self):
        return self.name


# 出版社
class Publish(models.Model):
    nid = models.AutoField(primary_key=True)
    name = models.CharField(max_length=32)
    city = models.CharField(max_length=32)
    email = models.EmailField()

    def __str__(self):
        return self.name


# 圖書列表
class Book(models.Model):
    nid = models.AutoField(primary_key=True)
    title = models.CharField(max_length=32)
    price = models.DecimalField(max_digits=15, decimal_places=2)
    # 外鍵字段
    publish = models.ForeignKey(to="Publish", related_name="book", related_query_name="book_query",
                                on_delete=models.CASCADE)
    # 多對多字段
    authors = models.ManyToManyField(to="Author")

urls.py文件

from django.urls import re_path
from xfzapp import views
from xfzapp import views2

urlpatterns = [
    # 第一步 設置url
    re_path(r'books/$', views.BookView.as_view()),
    re_path(r'books/(?P<nid>\d+)/$', views.BookFilterView.as_view()),

]

views.py視圖文件

# python內置
import json
from django.shortcuts import render, HttpResponse
from rest_framework.response import Response
from rest_framework.views import APIView
from .models import Course, Book, Author, Publish
from .xfz_serializers import BookSerializer


class BookView(APIView):
    def get(self, request):
        # 獲取queryset,<QuerySet [<Book: Book object (1)>, <Book: Book object (2)>, ... ]>
        origin_data = Book.objects.all()
        # 開始序列化
        serialized_data = BookSerializer(origin_data, many=True)
        # 將序列化后的數據, 響應給客戶端
        return Response(serialized_data.data)

    def post(self, request):
        # 序列化驗證,需要導入自定義的序列化類BookSerializer
        verified_data = BookSerializer(data=request.data)
        # 驗證通過
        if verified_data.is_valid():
            book = verified_data.save()
            # 傳參的時候要傳作者id,不要傳作者名字
            authors = Author.objects.filter(nid__in=request.data['authors'])
            # 給書添加作者信息
            book.authors.add(*authors)
            return Response(verified_data.data)
        # 驗證不通過
        else:
            return Response(verified_data.errors)


class BookFilterView(APIView):
    # 繼承APIView是因為所有的都是基於它
    def get(self, request, nid):
        book_obj = Book.objects.get(pk=nid)
        serialized_data = BookSerializer(book_obj, many=False)
        return Response(serialized_data.data)

    def delete(self, request, nid):
        book_obj = Book.objects.get(pk=nid).delete()
        return Response(book_obj)

    def put(self, request, nid):
        book_obj = Book.objects.get(pk=nid)
        verified_data = BookSerializer(data=request.data, instance=book_obj)
        if verified_data.is_valid():
            verified_data.save()
            return Response(verified_data.data)
        else:
            return Response(verified_data.errors)

序列化文件xfz_serializers.py

# 導入模塊
from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book

        fields = ('title',
                  'price',
                  'publish',
                  'authors',
                  'publish_name',
                  'publish_city'
                  )
        extra_kwargs = {
            'publish_id': {'write_only': True},
            'authors_id': {'write_only': True}
        }

    publish_name = serializers.CharField(max_length=32, read_only=True, source='publish.name')
    publish_city = serializers.CharField(max_length=32, read_only=True, source='publish.city')


    authors = serializers.SerializerMethodField()

    # "get_"是固定格式,"get_"后面部分與author_list保持一致,不能隨便寫
    def get_authors(self, book_obj):
        # 拿到queryset開始循環 [{}, {}, {}, {}]
        author_list = list()
        for author in book_obj.authors.all():
            author_list.append(author.name)
        return author_list

相關文章:

基礎班GET/POST接口設計:(Django原生序列化)

https://www.cnblogs.com/apollo1616/articles/10084614.html

進階版GET/POST接口設計:

https://www.cnblogs.com/apollo1616/articles/10085132.html

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM