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()
,这样就不需要传递额外的上下文。