![](/img/trans.png)
[英]serializer.is_valid() failing though `required=False` - Django REST Framework
[英]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.