[英]How to access extra data sent with POST request in Django Rest Framework serializer
I'm trying to send an extra array with a POST
request that creates a group. 我正在尝试发送带有创建组的POST
请求的额外数组。
POST /groups/
{
"name": “New Group“,
"users_to_invite": [ 1, 2, 6 ]
}
I'm using Django Rest Framework
's ListCreateAPIView
to handle the request: 我正在使用Django Rest Framework
的ListCreateAPIView
来处理请求:
class GroupListView(ListCreateAPIView):
queryset = Group.objects.all()
def get_serializer(self, *args, **kwargs):
kwargs['context'] = self.get_serializer_context()
# Use a dedicated serializer to inspect the field with users to invite
if self.request.method == 'POST':
return GroupCreateSerializer(*args, **kwargs)
return GroupSerializer(*args, **kwargs)
I want to get to the contents of the users_to_invite
array in a serializer to create invitation objects. 我想获取序列化程序中users_to_invite
数组的内容以创建邀请对象。 However, I'm unable to do so because somehow the array is not there when I'm accessing it in the serializer. 但是,我无法这样做,因为在序列化程序中访问数组时,数组以某种方式不存在。
class GroupCreateSerializer(ModelSerializer):
def create(self, validated_data):
# Get user ids to invite
# !! It fails here !!
invitations_data = validated_data.pop('users_to_invite')
# TODO: Iterate over ids and create invitations
# Create a group
group = Group.objects.create(**validated_data)
return group
class Meta:
model = Group
fields = ('id', 'name', )
Array is not there so naturally I'm getting the error: 数组不存在,所以自然会出现错误:
File "...my_api/serializers.py", line 303, in create
invitations_data = validated_data.pop('users_to_invite')
KeyError: 'users_to_invite'
How can I make the array to appear there? 我如何使数组出现在那里? Modifying the model does not sound like a good idea because I don't want to store what's in the array. 修改模型听起来不是一个好主意,因为我不想存储数组中的内容。
extra data is absent in validated_data
you can try use self.context['request']
details: including-extra-context , by default it added in the get_serializer method of view validated_data
中不存在额外的数据,您可以尝试使用self.context['request']
详细信息: includes -extra-context ,默认情况下 ,它已添加到视图的get_serializer方法中
for your case: 对于您的情况:
def create(self, validated_data):
# Get user ids to invite
# !! It fails here !!
request = self.context['request']
invitations_data = request.data.get('users_to_invite')
To send extra context data you should pass it from the method def get_serializer_context(self)
and access inside serializer like self.context.get("key")
. 要发送额外的上下文数据,您应该从方法def get_serializer_context(self)
传递它,并在序列化程序内部进行访问,例如self.context.get("key")
。
sample code: 样例代码:
class GroupListView(ListCreateAPIView):
queryset = Group.objects.all()
def get_serializer_context(self):
context = super(GroupListView, self).get_serializer_context()
context["users_to_invite"] = request.data.get("users_to_invite")
return context
class GroupCreateSerializer(ModelSerializer):
def create(self, validated_data):
users_to_invite = self.context.get("users_to_invite")
# do whatever you want
Apart from adding the data to context, you can add the field users_to_invite
to serializer as a CharField
. 除了将数据添加到上下文之外,还可以将字段users_to_invite
作为CharField
添加到序列化程序。
Example : 范例 :
import json
class GroupCreateSerializer(ModelSerializer):
def create(self, validated_data):
# Get user ids to invite
# !! It fails here !!
invitations_data = json.loads(validated_data.pop('users_to_invite'))
# TODO: Iterate over ids and create invitations
# Create a group
group = Group.objects.create(**validated_data)
return group
users_to_invite = serializers.CharField(required=False)
class Meta:
model = Group
fields = ('id', 'name', 'users_to_invite', )
Note: Make sure to have users_to_invite
in request data as a string. 注意:确保在请求数据中以字符串形式包含users_to_invite
。 Like: '[1, 2, 3]'
像: '[1, 2, 3]'
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.