Django REST Framework:“此字段为必填。”与required = False和unique_together [英] Django REST Framework : "This field is required." with required=False and unique_together

查看:585
本文介绍了Django REST Framework:“此字段为必填。”与required = False和unique_together的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想使用Django REST Framework保存一个简单的模型。唯一的要求是在 perform_create()方法中自动设置 UserVote.created_by 。失败的原因如下:

  {
created_by:[
此字段为必填。
]
}

我想这是因为unique_together索引。 / p>

models.py:

  class UserVote(models.Model): 
created_by = models.ForeignKey(User,related_name ='uservotes')
评级= models.ForeignKey(Rating)

class Meta:
unique_together =('created_by ','rating')

serializers.py

 类UserVoteSerializer(serializers.ModelSerializer):
id = serializers.IntegerField(read_only = True)
created_by = UserSerializer(read_only = True)

类元:
模型= UserVote
字段=('id','rating','created_by')

views.py

  class UserVoteViewSet(viewsets.ModelViewSet):
queryset = UserVote.objects.all()
serializer_class = UserVoteSerializer
Permission_classes =(IsCreatedByOrReadOnly,)

def perform_create(self,serializer):
serializer.save(created_by = self.request.user)

如何在不让用户提供 created_by 的情况下将模型保存在DRF中,而是自动在代码中设置此字段?



预先感谢!

解决方案

我遇到了类似的问题,并且解决了通过显式创建一个新实例并将其传递给序列化程序来实现。在 UserVoteViewSet 中,您必须用 create 代替 perform_create

  def create(self,request,* args,** kwargs):
uv = UserVote(created_by = self .request.user)
serializer = self.serializer_class(uv,data = request.data)
if serializer.is_valid():
serializer.save()
返回Response( serializer.data,status = status.HTTP_201_CREATED)
else:
return Response(serializer.errors,status = status.HTTP_400_BAD_REQUEST)


I want to save a simple model with Django REST Framework. The only requirement is that UserVote.created_by is set automatically within the perform_create() method. This fails with this exception:

{
    "created_by": [
        "This field is required."
    ]
}

I guess it is because of the unique_together index.

models.py:

class UserVote(models.Model):
    created_by = models.ForeignKey(User, related_name='uservotes')
    rating = models.ForeignKey(Rating)

    class Meta:
        unique_together = ('created_by', 'rating')

serializers.py

class UserVoteSerializer(serializers.ModelSerializer):
    id = serializers.IntegerField(read_only=True)
    created_by = UserSerializer(read_only=True)

    class Meta:
        model = UserVote
        fields = ('id', 'rating', 'created_by')

views.py

class UserVoteViewSet(viewsets.ModelViewSet):
    queryset = UserVote.objects.all()
    serializer_class = UserVoteSerializer
    permission_classes = (IsCreatedByOrReadOnly, )

    def perform_create(self, serializer):
        serializer.save(created_by=self.request.user)

How can I save my model in DRF without having the user to supply created_by and instead set this field automatically in code?

Thanks in advance!

解决方案

I had a similar problem and I solved it by explicitly creating and passing a new instance to the serializer. In the UserVoteViewSet you have to substitute perform_create with create:

 def create(self, request, *args, **kwargs):
    uv = UserVote(created_by=self.request.user)
    serializer = self.serializer_class(uv, data=request.data)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_201_CREATED)
    else:
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

这篇关于Django REST Framework:“此字段为必填。”与required = False和unique_together的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆