Django rest framework DRF序列化程序问题

Django rest framework DRF序列化程序问题,django-rest-framework,Django Rest Framework,我试图在此处使用serializer.serializer执行外键操作,但出现以下错误: 以下是我的模型: from django.db import models from django.core.validators import MinValueValidator, MaxValueValidator class Author(models.Model): name = models.CharField(max_length=100) country = models.

我试图在此处使用serializer.serializer执行外键操作,但出现以下错误:

以下是我的模型:

from django.db import models
from django.core.validators import MinValueValidator, MaxValueValidator

class Author(models.Model):
    name = models.CharField(max_length=100)
    country = models.CharField(max_length=40, blank=True)
    avatar = models.ImageField(upload_to="writer/", null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.name

class Comic(models.Model):
    author = models.ForeignKey(
        Author, on_delete=models.CASCADE, related_name='comics')
    title = models.CharField(max_length=100)
    active = models.BooleanField(default=False)
    chapter = models.IntegerField(default=1)
    publication_date = models.DateField()
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    image = models.ImageField(upload_to="comicPicture/", null=True, blank=True)

    def __str__(self):
        return self.title
观点:

from django.http import JsonResponse
from rest_framework.response import Response
from rest_framework.decorators import api_view
from rest_framework import status

from compie.models import Comic, Author
from compie.serializers import (ComicSerializer, AuthorSerializer)
from rest_framework.generics import get_object_or_404
from compie.pagination import SmallSetPagination


@api_view(['GET', 'POST'])
def comic_list(request):

    if request.method == "GET":
        comics = Comic.objects.all().order_by("-id")
        serializer = ComicSerializer(
            comics, many=True, context={'request': request})
        return Response(serializer.data)

    if request.method == 'POST':
        serializer = ComicSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)


@api_view(['GET', 'PUT', 'PATCH', 'DELETE'])
def comic_details(request, pk):
    try:
        comic = Comic.objects.get(pk=pk)
    except Comic.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = ComicSerializer(comic, context={'request': request})
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = ComicSerializer(comic, data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors,
                        status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'PATCH':
        serializer = ComicSerializer(comic,
                                     data=request.data,
                                     partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors,
                        status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        comic.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)


@api_view(['GET', 'POST'])
def author_list(request):

    if request.method == "GET":
        authors = Author.objects.all().order_by("-id")
        serializer = AuthorSerializer(
            authors, many=True, context={'request': request})
        return Response(serializer.data)

    if request.method == 'POST':
        serializer = AuthorSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=201)
        return Response(serializer.errors, status=400)


@api_view(['GET', 'PUT', 'PATCH', 'DELETE'])
def author_details(request, pk):
    try:
        author = Author.objects.get(pk=pk)
    except Author.DoesNotExist:
        return Response(status=status.HTTP_404_NOT_FOUND)

    if request.method == 'GET':
        serializer = AuthorSerializer(author, context={'request': request})
        return Response(serializer.data)

    elif request.method == 'PUT':
        serializer = AuthorSerializer(author, data=request.data)

        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors,
                        status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'PATCH':
        serializer = AuthorSerializer(author,
                                      data=request.data,
                                      partial=True)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors,
                        status=status.HTTP_400_BAD_REQUEST)

    elif request.method == 'DELETE':
        author.delete()
        return Response(status=status.HTTP_204_NO_CONTENT)
serializer.py文件:

    
from rest_framework import serializers
from compie.models import Comic, Author

class AuthorSerializer(serializers.Serializer):
        id = serializers.IntegerField(read_only=True)
        name = serializers.CharField()
        country = serializers.CharField()
        avatar = serializers.ImageField(allow_null=True)
        created_at = serializers.DateTimeField(read_only=True)
        updated_at = serializers.DateTimeField(read_only=True)
        # comics = ComicSerializer(read_only=True, many=True)
        comics = serializers.HyperlinkedRelatedField(
            many=True, read_only=True, view_name="comic_details")
    
        def create(self, validated_data):
            return Author.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            instance.name = validated_data.get('name', instance.name)
            instance.penname = validated_data.get('penname', instance.penname)
            instance.country = validated_data.get('country', instance.country)
            instance.avatar = validated_data.get('avatar', instance.avatar)
            instance.save()
            return instance
    
    
class ComicSerializer(serializers.Serializer):
    
        id = serializers.IntegerField(read_only=True)
        title = serializers.CharField()
        author = AuthorSerializer(read_only=True)
        active = serializers.BooleanField()
        chapter = serializers.IntegerField()
        publication_date = serializers.DateField()
        image = serializers.ImageField(allow_null=True)
        created_at = serializers.DateTimeField(read_only=True)
        updated_at = serializers.DateTimeField(read_only=True)
    
        def create(self, validated_data):
            return Comic.objects.create(**validated_data)
    
        def update(self, instance, validated_data):
            instance.author = validated_data.get('author', instance.author)
            instance.title = validated_data.get('title', instance.title)
            instance.active = validated_data.get('active', instance.active)
            instance.chapter = validated_data.get('chapter', instance.chapter)
            instance.publication_date = validated_data.get(
                'publication_date', instance.publication_date)
            instance.image = validated_data.get('image', instance.image)
            instance.save()
            return instance
URL.py文件:

from django.urls import path
        
from compie import views
        
urlpatterns = [
                path("authors/", views.author_list,
                     name="author_list_create"),
                path("author/<int:pk>/", views.author_details, name="author_details"),
                path("comics/", views.comic_list,
                     name="comic_list"),
                path("comics/<int:pk>/", views.comic_details, name="comic_details"),
              ]

从django.url导入路径
从compie导入视图
URL模式=[
路径(“authors/”,views.author\u列表,
name=“author\u list\u create”),
路径(“author/”,views.author\u details,name=“author\u details”),
路径(“漫画/”,views.comic_列表,
name=“漫画列表”),
路径(“漫画//”,views.comic\u details,name=“comic\u details”),
]
每当我尝试使用以下方法输入漫画时,就会出现此错误

注意:我使用ModelSerializer进行了尝试,但它执行正确