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

Raf*_*fAl 3 python django django-rest-framework

我正在尝试发送一个额外的数组以及POST创建组的请求。

\n\n
POST /groups/\n{\n  "name": \xe2\x80\x9cNew Group\xe2\x80\x9c,\n  "users_to_invite": [ 1, 2, 6 ]\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我正在使用Django Rest Framework\'sListCreateAPIView来处理请求:

\n\n
class GroupListView(ListCreateAPIView):\n    queryset = Group.objects.all()\n\n    def get_serializer(self, *args, **kwargs):\n        kwargs[\'context\'] = self.get_serializer_context()\n\n        # Use a dedicated serializer to inspect the field with users to invite\n        if self.request.method == \'POST\':\n            return GroupCreateSerializer(*args, **kwargs)\n        return GroupSerializer(*args, **kwargs)\n
Run Code Online (Sandbox Code Playgroud)\n\n

我想获取users_to_invite序列化器中数组的内容以创建邀请对象。但是,我无法这样做,因为当我在序列化器中访问它时,不知何故该数组不存在。

\n\n
class GroupCreateSerializer(ModelSerializer):\n\n    def create(self, validated_data):\n        # Get user ids to invite\n        # !! It fails here !!\n        invitations_data = validated_data.pop(\'users_to_invite\')\n\n        # TODO: Iterate over ids and create invitations\n\n        # Create a group\n        group = Group.objects.create(**validated_data)\n        return group\n\n    class Meta:\n        model = Group\n        fields = (\'id\', \'name\', )\n
Run Code Online (Sandbox Code Playgroud)\n\n

数组不存在,所以我很自然地收到错误:

\n\n
File "...my_api/serializers.py", line 303, in create\n    invitations_data = validated_data.pop(\'users_to_invite\')\nKeyError: \'users_to_invite\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n

小智 6

没有额外的数据,validated_data您可以尝试使用self.context['request']详细信息:include-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')
Run Code Online (Sandbox Code Playgroud)