我想在django rest框架中为必填字段自动分配一个值,而不必在post请求中给出值。
我的观点:
class WaitercallCreate(CreateAPIView):
serializer_class = WaitercallCreateSerializer
permission_classes = (IsAuthenticated, )
The Serializer:
class WaitercallCreateSerializer(serializers.ModelSerializer):
class Meta:
model = Waitercall
fields = ('order', 'user', 'done', 'type_of_call')
read_only_fields = ('user', 'done')
用户应该能够进行postrequest,只在标题中提供令牌,并将订单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)
哪个也行不通,因为Orderdicts是不可变的。 对于第一次(以及最后一次尝试,进一步阅读),我总是得到相同的答案:
{
"user": [
"This field is required."
]
}
最后我发现了this stackoverflow post,建议覆盖序列化程序中的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)
它也给了我同样的回应。我迷路了。如何解决这个问题的任何帮助将不胜感激! :)
答案 0 :(得分:1)
我也和你一样有同样的问题。如果您使用的是通用视图,请执行以下操作:
<强>查看:强>
def perform_create(self, serializer):
serializer.save(user=self.request.user)
<强>串行器:强>
您只需在序列化程序中添加此项以保存用户。 PrimaryKeyRelatedField
用于表示使用其主键的关系的目标。 read_only=True
使此字段为只读。
class WaitercallCreateSerializer(serializers.ModelSerializer):
user = serializers.PrimaryKeyRelatedField(read_only=True)
class Meta:
model = Waitercall
fields = ('order', 'user', 'done', 'type_of_call')
答案 1 :(得分:0)
错误来自序列化程序验证,该验证在调用create
方法之前调用。因此,对create
方法的更改没有任何区别。您可以通过调用序列化程序中不需要user
字段来解决此问题。这看起来像是:
from rest_framework import serializers
class WaitercallCreateSerializer(serializers.ModelSerializer):
user = serializers.JSONField(required=False)
class Meta:
model = Waitercall
fields = ('order', 'user', 'done', 'type_of_call')
read_only_fields = ('user', 'done')