Python 如何在Django Rest框架序列化程序中访问POST请求发送的额外数据
我正在尝试发送一个额外的数组,其中包含创建组的Python 如何在Django Rest框架序列化程序中访问POST请求发送的额外数据,python,django,django-rest-framework,Python,Django,Django Rest Framework,我正在尝试发送一个额外的数组,其中包含创建组的POST请求 POST /groups/ { "name": “New Group“, "users_to_invite": [ 1, 2, 6 ] } 我正在使用Django Rest Framework的ListCreateAPIView来处理请求: class GroupListView(ListCreateAPIView): queryset = Group.objects.all() def get_serial
POST
请求
POST /groups/
{
"name": “New Group“,
"users_to_invite": [ 1, 2, 6 ]
}
我正在使用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)
我想在序列化程序中访问users\u to\u invite
数组的内容,以创建邀请对象。但是,我无法这样做,因为当我在序列化程序中访问数组时,不知何故数组不在那里
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', )
数组不存在,因此我自然会得到错误:
File "...my_api/serializers.py", line 303, in create
invitations_data = validated_data.pop('users_to_invite')
KeyError: 'users_to_invite'
如何使数组显示在那里?修改模型听起来不是个好主意,因为我不想存储阵列中的内容 验证的\u数据中缺少额外数据您可以尝试使用
self.context['request']
details:,默认情况下,它添加到查看方法中
对于您的情况:
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')
validated_data
中缺少额外数据。您可以尝试使用self.context['request']
details:,默认情况下,它添加到视图方法中
对于您的情况:
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')
要发送额外的上下文数据,您应该从方法
def get_serializer\u context(self)
传递它,并在序列化程序内部访问,如self.context.get(“key”)
示例代码:
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
要发送额外的上下文数据,您应该从方法
def get_serializer\u context(self)
传递它,并在序列化程序内部访问,如self.context.get(“key”)
示例代码:
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
除了将数据添加到上下文之外,还可以将字段
users\u to\u invite
作为CharField
添加到序列化程序
示例:
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', )
注意:请确保在请求数据中以字符串形式包含
users\u to\u invite
。例如:“[1,2,3]”
除了将数据添加到上下文之外,还可以将字段用户添加到\u invite
到序列化程序,作为字符字段
示例:
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', )
注意:请确保在请求数据中以字符串形式包含users\u to\u invite
。比如:“[1,2,3]”