Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/322.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 向序列化程序django api传递数据时添加额外上下文_Python_Django_Api_Serialization_Django Rest Framework - Fatal编程技术网

Python 向序列化程序django api传递数据时添加额外上下文

Python 向序列化程序django api传递数据时添加额外上下文,python,django,api,serialization,django-rest-framework,Python,Django,Api,Serialization,Django Rest Framework,我正试图在带有request.data的表中添加一个额外的字段auth_令牌,但它给出了错误。错误是- data['auth\u token\u id']=auth\u token TypeError:列表索引必须是整数或切片,而不是str 我的代码如下: 序列化程序.py class AppSerializer(serializers.ModelSerializer): class Meta: model = ThirdPartyApps fields = ('app

我正试图在带有
request.data
的表中添加一个额外的字段auth_令牌,但它给出了错误。错误是-
data['auth\u token\u id']=auth\u token
TypeError:列表索引必须是整数或切片,而不是str

我的代码如下:

序列化程序.py

class AppSerializer(serializers.ModelSerializer):

  class Meta:
     model = ThirdPartyApps
     fields = ('app_name', 'package_name', 'auth_token_id')
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', '')
    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)
@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)
我正在寻找通过序列化程序传递额外数据的方法。 我只想将
auth_token
添加到我的模型中,就像
request.data
一样,但它给出了这个错误-

data['auth\u token\u id']=auth\u token

TypeError:列表索引必须是整数或片,而不是str

您应该将其作为上下文传递,如下所示:

序列化程序.py

class AppSerializer(serializers.ModelSerializer):

  class Meta:
     model = ThirdPartyApps
     fields = ('app_name', 'package_name', 'auth_token_id')
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', '')
    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)
@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)

请参阅此处的文档:

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

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)

另请参阅有关此主题的精彩教程

以及我将如何保存它?您的答案绝对准确,但我将如何将tit保存到我的表格如果您想保存它,您将创建一个模型(或使用现有模型)并向其添加一个字段,可能是一个
models.CharField(max_length=254)
然后将其设置为
model.auth\u token\u id=request.META.get('HTTP\u AUTHTOKEN','')
model.save()在您的视图中,或者在您接收auth token的位置。但是我的朋友,我想将其保存在序列化程序字段中提到的auth\u token\u id字段中,并带有app\u name和package\u name.Ahhh。正确的。因此,您应该获取模型
a=ThirdPartyApps.objects.get(…)
然后
a.auth\u token\u id=request.META.get('HTTP\u AUTHTOKEN','')
然后
a.save()
,这样就不需要传递额外的上下文。