繁体   English   中英

在将数据传递给序列化器Django API时添加额外的上下文

[英]adding an extra context while passing data to serializer django api

我正在尝试在表中使用request.data添加一个额外的字段auth_token,但它给出了错误。 错误是data['auth_token_id'] = auth_token TypeError: list indices must be integers or slices, not str

我的代码如下:

serializers.py

class AppSerializer(serializers.ModelSerializer):

  class Meta:
     model = ThirdPartyApps
     fields = ('app_name', 'package_name', 'auth_token_id')

views.py

@api_view(['POST'])
def add_apps(request):
    data = request.data
    auth_token = request.META.get('HTTP_AUTHTOKEN', '')
    data['auth_token_id'] = auth_token
    serializer = AppSerializer(data=data, many=True)
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors)

我正在寻找一种通过串行器传递额外数据的方法。 我只想将auth_tokenrequest.data一样添加到我的模型中,但是它给出了此错误-

data['auth_token_id'] = auth_token TypeError: list indices must be integers or slices, not str

您应该将其作为上下文传递:

serializers.py

class AppSerializer(serializers.ModelSerializer):
    auth_token_id = serializers.SerializerMethodField()
    def get_auth_token_id(self, obj):
        if "auth_token_id" in self.context:
            return self.context["auth_token_id"]
        return None
    class Meta:
         model = ThirdPartyApps
         fields = ('app_name', 'package_name', 'auth_token_id')

views.py

@api_view(['POST'])
def add_apps(request):
    data = request.data
    auth_token = request.META.get('HTTP_AUTHTOKEN', '')
    serializer = AppSerializer(data=data, many=True, context = {"auth_token_id": auth_token})
    if serializer.is_valid():
        serializer.save()
        return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors)

您还可以将值发送到序列化器的save方法

@api_view(['POST'])
def add_apps(request):
    data = request.data
    auth_token = request.META.get('HTTP_AUTHTOKEN', '')
    serializer = AppSerializer(data=data, many=True)
    if serializer.is_valid():
        serializer.save(auth_token_id=auth_token)
        return Response(serializer.data, status=status.HTTP_200_OK)
    else:
        return Response(serializer.errors)

请参阅此处的文档: http : //www.django-rest-framework.org/api-guide/serializers/#passing-additional-attributes-to-save

我们还可以使用基于类的视图,例如:

class AddApp(APIView):
      def post(request):
        data = request.data
        auth_token = request.META.get('HTTP_AUTHTOKEN', '')
        serializer = AppSerializer(data=data, many=True)
        if serializer.is_valid():
            serializer.save(auth_token_id=auth_token)
            return Response(serializer.data, status=status.HTTP_200_OK)
        else:
            return Response(serializer.errors)

也可以在这里查看有关此主题的出色教程

暂无
暂无

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

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