我想用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)
如何在不让用户提供 created_by
的情况下将模型保存在DRF中,而是在代码中自动设置此字段?
提前致谢!
3 回答
我有类似的问题,我通过显式创建并将新实例传递给序列化程序来解决它 . 在
UserVoteViewSet
中,您必须用create
替换perform_create
:您可以做的另一种奇怪的方法是使用这样的信号
那么基本上你可以在你的模型中定义pre_save
该系统的优点是您可以为每个模型使用相同的代码 . 如果您需要更改任何内容,只需更改
pre_save()
即可 . 您也可以添加更多内容我能用
views.py
中的单线来解决这个问题由于此视图需要对用户进行身份验证,因此不要忘记为
rest_framework.permissions.IsAuthenticated
扩展permission_classes