【发布时间】:2018-01-19 15:02:45
【问题描述】:
我想为 Django Rest 框架中的必填字段自动分配一个值,而不必在 post 请求中给出该值。
我的观点:
class WaitercallCreate(CreateAPIView):
serializer_class = WaitercallCreateSerializer
permission_classes = (IsAuthenticated, )
序列化器:
class WaitercallCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Waitercall
fields = ('order', 'user', 'done', 'type_of_call')
read_only_fields = ('user', 'done')
用户应该能够进行后请求,只需在标头中提供他们的令牌,并将订单 ID 作为正文。 我想将用户的默认值设置为请求用户。 我尝试在我的视图中覆盖 perform_create 方法,如下所示:
def perform_create(self, serializer):
serializer.save(user=self.request.user)
这不起作用。然后我尝试像这样覆盖视图中的 create 方法:
def create(self, request, *args, **kwargs):
data = request.data
data['user'] = request.user
serializer = self.get_serializer(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
headers = self.get_success_headers(serializer.data)
return Response(serializer.data, status=status.HTTP_201_CREATED, headers=headers)
这也不起作用,因为 Orderdict 是不可变的。对于第一次(也是最后一次尝试,请进一步阅读)我总是得到相同的响应:
{
"user": [
"This field is required."
]
}
最后我找到了thisstackoverflow 帖子,它建议覆盖序列化程序中的 create 方法。像这样:
def create(self, validated_data):
print(self.context['request'].user)
validated_data['user'] = self.context['request'].user
return super(WaitercallCreateSerializer, self).create(validated_data)
它也给了我同样的回应。我迷路了。接下来我可以尝试什么?
【问题讨论】:
-
您需要从
fields列表中排除您手动提供的字段。
标签: python django django-rest-framework httprequest