简体   繁体   English

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

[英]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 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)

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.

相关问题 在Django Rest Framework 3序列化程序中,如何访问请求对象? - In a Django Rest Framework 3 Serializer how do I access the request object? Django Rest Framework:如何将额外的参数传递给Django序列化程序? - Django Rest Framework: How to pass extra argument to django serializer? 带有额外字段的Django rest框架序列化器 - Django rest framework serializer with extra field 如何在python Django Rest Framework中的序列化器中获取其余请求? - How to get rest of the request in serializer in python django rest framework? 如何使用序列化程序在单个 view.py 中发布两个模型的数据? django 休息框架 - how to post data of two models in single view.py using serializer? django rest framework Python Django rest框架发布获取序列化程序 - Python Django rest framework Post Get Serializer Django REST Framework-在序列化程序测试中设置请求? - Django REST Framework - Set request in serializer test? 访问单个序列化器(Django Rest Framework) - Access a single serializer (Django Rest Framework) django rest框架:如何不允许对嵌套的序列化器数据进行验证? - django rest framework: How to not allow validation on a nested serializer data? 将一个额外的文件提交到序列化器中,并在Django Rest Framework中使用该字段返回经过验证的数据 - Alllow one extra filed into serializer and return validated data with that field in Django Rest Framework
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM