我正在尝试使用 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
urls.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"),
]
注意:我尝试使用 ModelSerializer,但它执行正确。