2017-09-25 3 views
0

J'essaye d'ajouter un champ supplémentaire auth_token dans ma table avec le request.data mais il donne des erreurs. L'erreur est - data['auth_token_id'] = auth_token TypeError: list indices must be integers or slices, not strajouter un contexte supplémentaire tout en passant des données à seriali django api

Mon code est donné ci-dessous:

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) 

Je cherche un moyen de transmettre des données supplémentaires à travers le sérialiseur. Je veux juste ajouter auth_token à mon modèle comme le request.data mais il donne cette erreur -

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

Répondre

1

Vous devez passer comme contexte comme ceci:

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

et comment vais-je le sauver? –

+0

votre réponse est certainement exacte mais comment vais-je sauver tit à ma table –

+0

Si vous vouliez l'enregistrer, vous devez créer un modèle (ou en utiliser un existant) et y ajouter un champ, probablement un 'models.CharField (max_length = 254) 'puis réglez-le' model.auth_token_id = request.META.get ('HTTP_AUTHTOKEN', '') 'puis' model.save() 'dans vos vues, ou d'où vous recevez le jeton auth. – montudor

0

Vous pouvez envoyer la valeur également à la méthode de sauvegarde du sérialiseur

@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) 

Voir docs ici: http://www.django-rest-framework.org/api-guide/serializers/#passing-additional-attributes-to-save