Get
方法可在可浏览的api端点中工作,但是当我尝试通过浏览器使用端点进行发布时,它会引发以下错误:(我的序列化器嵌套)
这是我的serializers.py
,它是嵌套的Serilizers
from rest_framework import serializers
from . models import Author, Article, Category, Organization
class OrganizationSerializer(serializers.ModelSerializer):
class Meta:
model = Organization
fields = '__all__'
class AuthorSerializer(serializers.ModelSerializer):
organization = OrganizationSerializer()
class Meta:
model = Author
fields = '__all__'
class CategorySerializer(serializers.ModelSerializer):
class Meta:
model = Category
fields = '__all__'
class ArticleSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
category = CategorySerializer()
class Meta:
model = Article
fields = '__all__'
这是我的models.py
from django.db import models
import uuid
class Organization(models.Model):
organization_name = models.CharField(max_length=50)
contact = models.CharField(max_length=12, unique=True)
def __str__(self):
return self.organization_name
class Author(models.Model):
name = models.CharField(max_length=40)
detail = models.TextField()
organization = models.ForeignKey(Organization, on_delete=models.DO_NOTHING)
def __str__(self):
return self.name
class Category(models.Model):
name = models.CharField(max_length=100)
def __str__(self):
return self.name
class Article(models.Model):
alias = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE, related_name='author')
title = models.CharField(max_length=200)
body = models.TextField()
category = models.ForeignKey(Category, on_delete=models.CASCADE)
这是我的views.py
(我使用的是APIView,而不是VIewset)
class ArticleDeleteUpdate(DestroyAPIView, UpdateAPIView):
queryset = Article.objects.all()
serializer_class = ArticleSerializer
lookup_field = 'alias'
这是我的urls.py
path('api/v1/article', views.ArticleListCreateGet.as_view(), name='article2'),
我花了10个小时来解决此问题,但未能解决...
我没有发现这是什么问题...这个错误毁了我的睡眠。
有人可以帮助我解决此问题吗?
答案 0 :(得分:1)
使用正确的方法进行编辑: 抱歉,我刚刚意识到您使用的是ModelSerializers而不是Serializers。 您需要从
更改class ArticleSerializer(serializers.ModelSerializer):
author = AuthorSerializer()
category = CategorySerializer()
class Meta:
model = Article
fields = '__all__'
到
class ArticleSerializer(serializers.ModelSerializer):
author = serializers.PrimaryKeyRelatedField()
category = serializers.PrimaryKeyRelatedField()
class Meta:
model = Article
fields = '__all__'
并检查PrimaryKeyRelatedField的文档,因为它包含一些可能对API设计很有趣的选项
https://www.django-rest-framework.org/api-guide/relations/#primarykeyrelatedfield
您很有可能需要使用read_only=True
选项,因此您无需覆盖任何方法
原始答案并附带一些解释:
之所以会出现错误,是因为POST试图创建嵌套对象,但是您的序列化程序没有覆盖.create()
方法,因此序列化程序不知道如何处理嵌套关系。
在https://www.django-rest-framework.org/api-guide/serializers/#writing-create-methods-for-nested-representations上查看一下,您可以了解所需的内容。