【问题标题】:django rest framework - POST request causes 400 status codedjango rest 框架 - POST 请求导致 400 状态码
【发布时间】:2018-12-07 03:46:27
【问题描述】:

我正在尝试执行 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)

【问题讨论】:

  • 可以加Article模特吗?
  • @JPG 我已经添加了
  • 也添加您的 AUTH_USER_MODEL
  • @nishant AUTH_USER_MODEL 我认为是 Django 内置的东西

标签: django model-view-controller django-rest-framework serialization django-serializer


【解决方案1】:

根据您的序列化程序,验证过程需要 author 详细信息,它不会通过 POST 有效负载。
因此,通过添加 required=False 或使用 ReadOnlyField() 或指定 read_only_fields。还将上下文数据传递为提到的@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)

【讨论】:

  • 我收到TypeError: Object of type 'User' is not JSON serializable "POST /api/articles/create/ HTTP/1.1" 500
  • 我已经添加了
  • @Senyokbalgul 我已经更新了 serializer.py。立即尝试
【解决方案2】:

添加这个

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

【讨论】:

  • 我已经试过了。并且不需要指定context,因为它是隐式传递给序列化程序的。
  • @Senyokbalgul 你也可以添加你的 AUTH_USER_MODEL
  • AUTH_USER_MODEL 我认为是 Django 内置的东西
  • 好的,你使用的是内置模型
  • 是from django.conf import settings,然后是settings.AUTH_USER_MODEL
猜你喜欢
  • 2023-03-21
  • 2016-01-10
  • 1970-01-01
  • 2018-12-20
  • 2023-03-16
  • 2016-04-07
  • 2021-05-06
  • 2020-10-05
  • 1970-01-01
相关资源
最近更新 更多