/SerDemo/serializers.py
from rest_framework import serializers
from djangoDemo.models import Book
import copy
class PublishSerializer(serializers.Serializer):
id = serializers.IntegerField()
title = serializers.CharField(max_length=32)
class AuthorSerializer(serializers.Serializer):
id = serializers.IntegerField()
name = serializers.CharField(max_length=32)
class BookSerializer(serializers.ModelSerializer):
publisher_info = serializers.SerializerMethodField(read_only=True)
authors_info = serializers.SerializerMethodField(read_only=True)
def get_authors_info(self, obj):
authors_querset = obj.authors.all()
return [{"id": author.id, "name": author.name} for author in authors_querset]
def get_publisher_info(self, obj):
publisher_obj = obj.publisher
return {"id": publisher_obj.id, "title": publisher_obj.title}
class Meta:
model = Book
fields = "__all__"
# exclude=["id"]
# 会让你这些所有的外键关系变成read_only = True
# depth = 1
extra_kwargs = {"publisher": {"write_only": True}, "authors": {"write_only": True}}
/DRFDemo/DRFDemo/urls.py
from django.conf.urls import url
from .views import BookView, BookEditView
urlpatterns = [
url(r'^book/', BookView.as_view()),
url(r'^books/(?P<id>\d+)', BookEditView.as_view()),
]
/DRFDemo/SerDemo/views.py
from rest_framework.views import APIView
from djangoDemo.models import Book
from .serializers import BookSerializer
from rest_framework.response import Response
class BookEditView(APIView):
def get(self, request, id):
book_obj = Book.objects.filter(id=id).first()
ser_obj = BookSerializer(book_obj)
return Response(ser_obj.data)
def put(self, request, id):
book_obj = Book.objects.filter(id=id).first()
# partial=True 对序列化器中的update方法中, 只对部分字段进行校验
ser_obj = BookSerializer(instance=book_obj, data=request.data, partial=True)
if ser_obj.is_valid():
ser_obj.save()
return Response(ser_obj.validated_data)
return Response(ser_obj.errors)
原文:https://www.cnblogs.com/cjwnb/p/11688848.html