嵌套序列化的DRF端点发布错误

时间:2019-06-23 16:02:25

标签: django django-rest-framework django-views

Get方法可在可浏览的api端点中工作,但是当我尝试通过浏览器使用端点进行发布时,它会引发以下错误:(我的序列化器嵌套)

enter image description here

这是我的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个小时来解决此问题,但未能解决...

我没有发现这是什么问题...这个错误毁了我的睡眠。

有人可以帮助我解决此问题吗?

1 个答案:

答案 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上查看一下,您可以了解所需的内容。