IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Django Python Discussion :

Serializer avec des objets multiple


Sujet :

Django Python

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Points : 88
    Points
    88
    Par défaut Serializer avec des objets multiple
    Bonjour,

    J'ai un front en React et un back avec Django
    Pour le connexion, j'utilise le module django-rest-framework-simplejwt pour générer un token
    Ce package fournit une API refreshToken qui renvoie un nouveau Token.

    Je voudrais également renvoyer le token et les infos de l'utilisateur connecté

    Voici ce que j'ai fait :

    Mon serializer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    class MyTokenRefreshSerializer(serializers.Serializer):
        token = TokenRefreshSerializer()
        user = UserSerializer()
    La vue
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    class MyTokenRefreshView(TokenRefreshView):
        serializer_class = MyTokenRefreshSerializer
     
        def post(self, request, *args, **kwargs):
     
     
            refreshToken = request.data
            serializerRefresh = TokenRefreshSerializer(data=refreshToken)
            if (serializerRefresh.is_valid()):
     
                #Je récupère le token et les infos de l'utilisateur à partir de celui-ci
                validated_token = JWTTokenUserAuthentication.get_validated_token(self,serializerRefresh.validated_data.get('access'))
                userId = JWTTokenUserAuthentication.get_user(self,validated_token)
                user = User.objects.get(pk=userId.pk)
     
                serializer = UserSerializer(user)
                data = OrderedDict([('token',refreshToken),('user',user)])
     
                tokenRefreshCustomSerializer = MyTokenRefreshSerializer(data=data)            
     
                if (tokenRefreshCustomSerializer.is_valid()):
                    return Response(tokenRefreshCustomSerializer.validated_data)                   
            return Response(tokenRefreshCustomSerializer.errors)
    Voici l'erreur retourné à l'exécution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    {
        "user": {
            "non_field_errors": [
                "Invalid data. Expected a dictionary, but got User."
            ]
        }
    }
    Est ce que je suis parti sur la bonne voie pour retourner mon token et les infos utilisateur ? Si oui, que dois-je faire pour corriger l'erreur ? Sinon, comment faire ?

    Merci pour votre aide

  2. #2
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    Il faudrait ta classe UserSerializer
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Points : 88
    Points
    88
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    class UserSerializer(serializers.ModelSerializer):
     
        customer = CustomerSerializer()
        settings = serializers.SerializerMethodField()
        role = serializers.SerializerMethodField()
     
        def get_settings(self,objects):
            return {"layout": {}}
     
        def get_role(self,object):
     
            if object.is_staff:
                return "admin" 
            else:
                return "guest"       
     
     
     
        class Meta:
            model = User
            fields = ('id','username','is_staff','first_name', 'last_name', 'email', 'is_superuser','customer','settings','role')

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 812
    Points : 7 097
    Points
    7 097
    Par défaut
    Tu te compliques vachement la vie je trouve, difficile de voir dans tout ça, peut-être voir du côté de la ligne 17-18 si c'est pas serializer.data qu'on attend à la place de user.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Points : 88
    Points
    88
    Par défaut
    Peut-être que je me suis compliqué la vie...mais je ne vois pas comment faire autrement..

    Si tu as une piste à me donner...

  6. #6
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Points : 88
    Points
    88
    Par défaut
    En mettant serializer.data, il y a du mieux mais maintenant j'ai ça...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    {
        "user": {
            "username": [
                "A user with that username already exists."
            ],
            "customer": {
                "user": [
                    "This field must be unique."
                ],
                "company": {
                    "siret": [
                        "company with this siret already exists."
                    ]
                }
            }
        }
    }

Discussions similaires

  1. [POO] Listing avec des objets
    Par estampille dans le forum Langage
    Réponses: 5
    Dernier message: 27/08/2007, 16h19
  2. Réponses: 1
    Dernier message: 05/06/2007, 17h14
  3. formulaire avec des champs multiples
    Par don'de dans le forum Struts 1
    Réponses: 13
    Dernier message: 16/02/2007, 09h42
  4. [C#]Travailler en synchrone avec des objets asynchrone
    Par mister3957 dans le forum Windows Forms
    Réponses: 3
    Dernier message: 19/10/2006, 18h12
  5. Tag : present avec des roles multiples
    Par zola dans le forum Struts 1
    Réponses: 4
    Dernier message: 28/04/2006, 18h01

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo