Ошибка публикации конечной точки DRF для вложенной сериализации - PullRequest
0 голосов
/ 23 июня 2019

Get метод, работающий в конечной точке API с возможностью просмотра, но когда я пытаюсь опубликовать сообщение с помощью своей конечной точки через браузер, он выдает мне эту ошибку: (Мои сериализаторы вложены)

enter image description here

Это мой serializers.py и это вложенные серилизаторы

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 Ответ

1 голос
/ 23 июня 2019

РЕДАКТИРОВАТЬ с правильным подходом: Извините, я только что понял, что вы используете ModelSerializer вместо Serializer. Вам нужно изменить с

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 / апи-гид / отношения / # primarykeyrelatedfield

Скорее всего, вам понадобится опция read_only=True, поэтому вам не нужно переопределять какой-либо метод

Оригинальный ответ с небольшим объяснением: Вы получаете сообщение об ошибке, поскольку POST пытается создать вложенные объекты, но ваш сериализатор не переопределяет метод .create(), поэтому сериализатор не знает, как обрабатывать вложенные отношения.

Взгляните на https://www.django -rest-framework.org / api-guide / serializers / # writing-create-методов-для-вложенных-представлений , где вы можете получить представление о том, что вы необходимо.

...