繁体   English   中英

Django REST serializer.is_valid() 返回 False

[英]Django REST serializer.is_valid() returns False

我想在我的视图中处理创建者字段

@api_view(['POST', ])
def api_create_news_post_view(request):
    user = User.objects.get(pk=1)
    news_post = NewsPost(creator=user)

    if request.method == 'POST':
        serializer = NewsPostSerializer(news_post, data=request.data)
        if serializer.is_valid():
            serializer.save()
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

我用所需的数据补充请求并将其传递给序列化程序

class NewsPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = NewsPost
        fields = ['title', 'content', 'date_created', 'creator']

对于这个 model

class NewsPost(models.Model):
    title = models.CharField(max_length=100, unique=True)
    content = models.TextField()
    date_created = models.DateTimeField(auto_now_add=True)
    creator = models.ForeignKey(User, on_delete=models.CASCADE)

    class Meta:
        verbose_name = ("News Post")
        verbose_name_plural = ("News Posts")

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse("NewsPost_detail", kwargs={"pk": self.pk})

我发送"title": "Lansino dores amores devacia ", "content": "Apollo antro" ,在我看来,我从数据库中获取用户 object,基于它创建 NewsPost 并将其与请求数据一起传递给 NewsPostSerializer,但它没有't pass validation and return "creator": ["This field is required."]不知道为什么会这样。

它的行为是这样的,因为您将creator添加到字段中,因此它是必填字段。 你有三种解决方案来解决你的问题,这取决于你想要什么。

将其设为可选字段,以便您可以使用 API 更新creator

class NewsPostSerializer(serializers.ModelSerializer):
    creator = serializers.CharField(required=False)

    class Meta:
        model = NewsPost
        fields = ['title', 'content', 'date_created', 'creator']

将 if 设为只读字段,因此您永远不能写入它(即使您在 PUT 有效负载中传递它),但每次序列化都会返回它。

class NewsPostSerializer(serializers.ModelSerializer):
    class Meta:
        model = NewsPost
        read_only_fields = ['creator']
        fields = ['title', 'content', 'date_created', 'creator']

第三个选项是创建一个没有creator字段的序列化程序。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM