繁体   English   中英

如何在Django Rest Framework序列化程序中访问通过POST请求发送的额外数据

[英]How to access extra data sent with POST request in Django Rest Framework serializer

我正在尝试发送带有创建组的POST请求的额外数组。

POST /groups/
{
  "name": “New Group“,
  "users_to_invite": [ 1, 2, 6 ]
}

我正在使用Django Rest FrameworkListCreateAPIView来处理请求:

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_to_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'

我如何使数组出现在那里? 修改模型听起来不是一个好主意,因为我不想存储数组中的内容。

validated_data中不存在额外的数据,您可以尝试使用self.context['request']详细信息: includes -extra-context ,默认情况 ,它已添加到视图的get_serializer方法中

对于您的情况:

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_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_to_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_to_invite 像: '[1, 2, 3]'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM