我想用Django REST Framework保存一个简单的模型,唯一的要求是在perform_create()
方法中自动设置UserVote.created_by
,这会失败,并出现以下异常:
{
"created_by": [
"This field is required."
]
}
我想这是因为unique_together索引的缘故。
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)
如何在DRF中保存我的模型,而不需要用户提供created_by
,而是在代码中自动设置此字段?
先谢了!
5条答案
按热度按时间xwbd5t1u1#
我也遇到过类似的问题,我通过显式创建一个新示例并将其传递给序列化器来解决它。在
UserVoteViewSet
中,必须用create
替换perform_create
:gijlo24d2#
我能够用
views.py
中的一行程序解决这个问题由于此视图要求用户经过身份验证,因此不要忘记将
permission_classes
扩展为rest_framework.permissions.IsAuthenticated
xdyibdwo3#
另一个奇怪的方法是使用这样的信号
然后,基本上可以在模型中定义pre_保存
这个系统的优点是你可以为每个模型使用相同的代码。如果你需要改变什么,只需在
pre_save()
中改变。你也可以添加更多的东西k5hmc34c4#
将以下内容添加到
ViewSet
:在
Serializer
上还有以下代码:wn9m85ua5#
下面的代码对我有效。
即使是我也面临着同样的错误,在许多实验后发现了一些东西,所以添加了类 meta中
serializer.py
的所有字段,如下所示-在这里,我们可以更新
"extra_kwargs"
中的任何字段,它不会显示错误["This field is required."]