簡體   English   中英

django rest框架-POST請求導致400狀態代碼

[英]django rest framework - POST request causes 400 status code

我正在嘗試執行POST請求以創建文章,但出現此錯誤, Request failed with status code 400 Bad Request: /api/articles/create/

文章需要創建3個屬性:
(1)標題
(2)身體
(3)作者(當前用戶)

由於POST請求進入ArticleCreateView類的post方法,因此路由器工作正常。 但是我猜測出於某種原因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)

加上這個

serializer = ArticleSerializer(data=request.data, context={'request':request})

根據您的序列化器,驗證過程需要author詳細信息,而這些信息不會通過POST有效負載傳遞。
因此,通過添加required=False或使用ReadOnlyField()或在Meta類中指定read_only_fields ,使序列化程序中的author字段成為非必需字段。 還傳遞上下文數據,如@nishant所述

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

    def post(self, request):
        serializer = ArticleSerializer(data=request.data, context={"request": request}) # change here 
        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__'
        read_only_fields = ('author',)

    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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM