2017-09-25 41 views
0

我试图在request.data的表中添加额外的字段auth_token,但它给出了错误。错误是 - data['auth_token_id'] = auth_token TypeError: list indices must be integers or slices, not str在将数据传递到序列化程序时添加额外的上下文django api

我的代码如下:

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_token到我的模型像request.data但它给这个错误 -

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

回答

1

你应该把它作为背景下,像这样:

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) 
+0

和我将如何保存呢? –

+0

你的答案绝对准确,但我如何将tit保存到我的表格 –

+0

如果你想保存它,你可以创建一个模型(或使用现有的模型)并添加一个字段,可能是一个'models.CharField(max_length = 254)'然后在你的视图中或者你从中接收认证令牌的地方设置'model.auth_token_id = request.META.get('HTTP_AUTHTOKEN','')',然后'model.save()'。 – montudor

0

您也可以发送值到串行的保存方法

@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

相关问题