整理和序列化serialize和视图类APIView相关的代码

发布时间 2023-05-19 21:36:43作者: 岳宗柯

book表

一、先建好好modelsbook表模型

from django.db import models

# Create your models here.


class Book(models.Model):
    name = models.CharField(max_length=32)
    price = models.CharField(max_length=32)
    publish = models.ForeignKey(to='Publish',
                                on_delete=models.SET_NULL,
                                null=True)
    authors = models.ManyToManyField(to='Author')


class Publish(models.Model):
    name = models.CharField(max_length=32)
    addr = models.CharField(max_length=32)

class Author(models.Model):
    name = models.CharField(max_length=32)
    phone = models.CharField(max_length=11)
    author_detail = models.OneToOneField(to='AuthorDetail',
                                         on_delete=models.CASCADE)

class AuthorDetail(models.Model):
    email = models.CharField(max_length=32)
    age = models.IntegerField()

二、在serialize文件中写继承serializers.ModelSerializer的BookSerializer类

from rest_framework import serializers
from .models import Book


class BookSerializer(serializers.ModelSerializer):
    class Meta:
        model = Book
        fields = ['name', 'price', 'publish_detail', 'author_list', 'publish', 'authors']  # 自定制的字段,一定要在这里注册一下
        extra_kwargs = {
            'name': {'max_length': 10, 'required': True},
            'publish': {'write_only': True},
            'authors': {'write_only': True}
        }


    publish_detail = serializers.DictField(read_only=True)
    author_list = serializers.ListField(read_only=True)

三、在视图view中写BookView类的增删查改

from django.shortcuts import render

# Create your views here.
from rest_framework.views import APIView
from rest_framework.response import Response
from .models import Book
from .serializer import BookSerializer


class BookView(APIView):
    def get(self, request):
        qs = Book.objects.all()
        ser = BookSerializer(qs, many=True)
        return Response({'code': 100,
                         'mag': '成功',
                         'results': ser.data})

    def post(self, request):
        ser = BookSerializer(data=request.data)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100,
                             'msg': '成功'})
        else:
            return Response({'code': 100,
                             'msg': ser.errors})

class BookDetailView(APIView):
    def get(self, request, pk):
        book = Book.objects.all().get(pk=pk)
        ser = BookSerializer(book)
        return Response({'code': 100,
                         'msg': '成功',
                         'results': ser.data})

    def put(self, request, pk):
        book = Book.objects.get(pk=pk)
        ser = BookSerializer(data=request.data,instance=book)
        if ser.is_valid():
            ser.save()
            return Response({'code': 100,
                             'msg': '更新成功'})
        else:
            return Response({'code': 100,
                             'msg': ser.errors})