django rest framework - запрос POST вызывает код состояния 400 - PullRequest
0 голосов
/ 07 декабря 2018

Я пытаюсь выполнить запрос POST для создания статьи, и я получаю эту ошибку Request failed with status code 400 Bad Request: /api/articles/create/.

Для статьи необходимо создать 3 атрибута:
(1) название
(2) тело
(3) автор (текущий пользователь)

Маршрутизатор работаетхорошо, поскольку запрос POST входит в метод post класса ArticleCreateView.Но я предполагаю, что serializer.is_valid() возвращает False по какой-то причине.Также print(request.data) возвращает {'title': 'hello', 'body': 'stuff'}

Еще одна загадка в Django: откуда сериализатор узнает, хочу ли я получить, создать или обновить что-то?Во всех примерах, которые я видел, сериализатор волшебным образом это знает.

class ArticleCreateView(CreateAPIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        serializer = ArticleSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)


class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'

    def create(self, validated_data):
        author = self.context['request'].user
        title = validated_data.get('title')
        body = validated_data.get('body')
        return Article.objects.create(author=author, title=title, body=body)


class Article(models.Model):
    author = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
    title = models.CharField(max_length=100)
    body = models.TextField(max_length=100)
    date_updated = models.DateTimeField(auto_now=True)
    date_created = models.DateTimeField(auto_now_add=True)

Ответы [ 2 ]

0 голосов
/ 07 декабря 2018

Согласно вашему сериализатору, для процесса проверки требуются author подробности, которые не проходят через полезную нагрузку POST.
Итак, заполните поле author в полеСериализатор необязательное поле путем добавления required=False или использования ReadOnlyField() или указания read_only_fields в мета-классе.Также передайте контекстные данные как @ nishant упомянутый

# views.py
class ArticleCreateView(CreateAPIView):
    permission_classes = [IsAuthenticated]

    def post(self, request):
        <b>serializer = ArticleSerializer(data=request.data, context={"request": request}) # change here </b>
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data)
        return Response(serializer.errors)
# serializer.py
class ArticleSerializer(serializers.ModelSerializer):
    class Meta:
        model = Article
        fields = '__all__'
        <b>read_only_fields = ('author',)</b>

    def create(self, validated_data):
        author = self.context['request'].user
        title = validated_data.get('title')
        body = validated_data.get('body')
        return Article.objects.create(author=author, title=title, body=body)
0 голосов
/ 07 декабря 2018

добавить

1002 *
...