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 un model ManyToMany avec un argument Through [Python 3.X]


Sujet :

Django Python

  1. #1
    Membre très actif Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Par défaut Serializer un model ManyToMany avec un argument Through
    Bonjour a tous
    je veux crée une api de covoiturage, donc j'ai crée ces principaux modèles:
    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    class lieux(models.Model):
     
        wilaya = models.CharField(max_length=20)
        ville = models.CharField(max_length=20)
        rue = models.CharField(max_length=30)
     
    class Course(models.Model):
        user_driver = models.ForeignKey(User, on_delete=models.CASCADE)
        time_creation =models.DateField()
        time_depart =models.DateField()
        nbr_places = models.IntegerField()
        trajet_course = models.ManyToManyField(lieux,through='trajet',related_name='trajets',blank=True)
        participents_course = models.ManyToManyField(User, through='participents',related_name='U_P',blank=True)
        demande_course = models.ManyToManyField(User, through='demande_participe',related_name='D_P',blank=True)
     
    class trajet(models.Model):
        #type_c = [('D','depart'),('AV','arrivé'),('AT','arret')]
        type_course = models.CharField(max_length=10,null=True)
        num_arret = models.IntegerField(null=True,blank=True)
        arret=models.ForeignKey(lieux, on_delete=models.CASCADE,null=True)
        course_arret = models.ForeignKey(Course, on_delete=models.CASCADE,null=True)
        class participents(models.Model):
        users_voyageur = models.ForeignKey(User, on_delete=models.CASCADE)
        course_participer = models.ForeignKey(Course, on_delete=models.CASCADE)
        prix_payer = models.IntegerField(null=True)
     
     
     
    class demande_participe(models.Model):
        users_demadeur = models.ForeignKey(User, on_delete=models.CASCADE)
        course_demande = models.ForeignKey(Course, on_delete=models.CASCADE)
        reponse_demande = models.IntegerField(null=True)
    et le Serializer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class courses_json(serializers.ModelSerializer):
        #type_course = serializers.ReadOnlyField(source= 'trajet.type_course')
        #num_arret = serializers.ReadOnlyField(source='trajet.num_arret')
        user_driver = UserSerializer(read_only = True)
        #trajet_course = trajet_json(many = True,read_only = True)
        trajet_course = lieux_json(many = True)
        participents_course = UserSerializer(many = True,read_only = True)
        demande_course = UserSerializer(many = True)
     
        class Meta:
            model = Course
            fields = ('__all__')

    et j’obtiens ce résultat :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
    {
            "id": 15,
            "user_driver": {
                "username": "animalx123",
                "id": 30
            },
            "trajet_course": [
                {
                    "id": 34,
                    "wilaya": "annaba",
                    "ville": "centre ville",
                    "rue": ""
                },
                {
                    "id": 35,
                    "wilaya": "alger",
                    "ville": "dergana",
                    "rue": ""
                }
            ],
            "participents_course": [],
            "demande_course": [
                {
                    "username": "malcomx",
                    "id": 31
                },
                {
                    "username": "ZedNiiw55",
                    "id": 57
                },
                {
                    "username": "animalx123",
                    "id": 30
                }
            ],
            "time_creation": "2019-09-28",
            "time_depart": "2019-12-14",
            "nbr_places": 3
        },
    alors que je veux avoir le model trajet avec les lieux dedans comme ç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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
     
    {
            "id": 15,
            "user_driver": {
                "username": "animalx123",
                "id": 30
            },
            "trajet_course": [
             {
               "type_course":"départ"
     
                {
                    "id": 34,
                    "wilaya": "annaba",
                    "ville": "centre ville",
                    "rue": ""
                }},
                {
                    "type_course" :"Arrivé"
                  {
                    "id": 35,
                    "wilaya": "alger",
                    "ville": "dergana",
                    "rue": ""
                }
            ],
            "participents_course": [],
            "demande_course": [
                {
                    "username": "malcomx",
                    "id": 31
                },
                {
                    "username": "ZedNiiw55",
                    "id": 57
                },
                {
                    "username": "animalx123",
                    "id": 30
                }
            ],
            "time_creation": "2019-09-28",
            "time_depart": "2019-12-14",
            "nbr_places": 3
        },
    j'ai bien cherché sur le net et forum mais j'ai pas trouvé une solution a ma problématique, car même dans le model (demande_participe et participents) me retourne pas tout les champs mais que qui sont en relation (ForeignKey),
    merci de m'aider car ça fait des semaines que je coince sur ce problème.

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 050
    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 : 4 050
    Par défaut
    Bonjour,

    Tu as une solution sur stackoverflow

  3. #3
    Membre très actif Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Par défaut
    J'ai passé en revus toutes les discussions sur stackoverflow avant de posté sur ce forum, car mon problème est que je veux affiché la table intermédiaire(trajet) que j'ai crée avec l'argument throgh

    comme ç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
    19
    20
     
    "trajet_course": [
             {
               "type_course":"départ"
     
                {
                    "id": 34,
                    "wilaya": "annaba",
                    "ville": "centre ville",
                    "rue": ""
                }},
                {
                    "type_course" :"Arrivé"
                  {
                    "id": 35,
                    "wilaya": "alger",
                    "ville": "dergana",
                    "rue": ""
                }
            ],

  4. #4
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 050
    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 : 4 050
    Par défaut
    Bonjour,

    Vous ne montrez pas ce que vous tentez quand on vous propose une solution, et admettez que vos tests sont fait de la bonne manière.
    Si vous le pensez, alors c'est que ça doit être bon, je ne vais pas vous contrariez, c'est vous qui faîtes les tests.

    Django sans tester, c'est difficile, à la rigueur, en ayant du temps de disponible, on pourrait voir après partage de votre projet sur un outil collaboratif, ce que donne des tests... mais sans cela, je ne peux que proposer des liens internet qui me semblent correspondre à votre demande.

    Donc je suppose que de votre côté, en faisant plusieurs tests, vous arriverez sans doute à déterminer ce dont vous avez besoin.

    Mettez vous à la place de ceux qui répondent, ont-ils toutes les informations nécessaires ? Peuvent-ils reproduire ? .... ?

  5. #5
    Membre très actif Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Par défaut
    j'ai modifier mon serializer 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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
     
     
    class lieux_json(serializers.ModelSerializer):
     
        class Meta :
            model = lieux
            fields = ('__all__')
     
    class trajet_json(serializers.ModelSerializer):
     
     
     
     
        #arret = lieux_json(read_only = True,many = True)
     
        class Meta :
            model = trajet
            #fields = ['id','type_course','num_arret','arret','course_arret']
            fields = ('__all__')
     
     
    class courses_json(serializers.ModelSerializer):
     
        user_driver = UserSerializer(read_only = True)
        trajet_course = trajet_json(source='trajet_set',many = True)
        #arret = lieux_json(many = True)
        participents_course = UserSerializer(many = True,read_only = True)
        demande_course = UserSerializer(many = True)
     
        class Meta:
            model = Course
            fields = ('__all__')
    et j'ai ceci :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
     
    {
            "id": 9,
            "user_driver": {
                "username": "animalx123",
                "id": 30
            },
            "trajet_course": [],
            "participents_course": [],
            "demande_course": [],
            "time_creation": "2019-09-27",
            "time_depart": "2019-05-02",
            "nbr_places": 3
        },
        {
            "id": 10,
            "user_driver": {
                "username": "animalx123",
                "id": 30
            },
            "trajet_course": [
                {
                    "id": 1,
                    "type_course": "depart",
                    "num_arret": null,
                    "arret": 24,
                    "course_arret": 10
                },
                {
                    "id": 2,
                    "type_course": "arrivé",
                    "num_arret": null,
                    "arret": 25,
                    "course_arret": 10
                }
            ],
            "participents_course": [],
            "demande_course": [],
            "time_creation": "2019-09-27",
            "time_depart": "2019-06-02",
            "nbr_places": 3
        },
    et moi je veux afficher le contenu de (arret) pas juste le id , et quand je rajoute ca au serializer trajet:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    arret = lieux_json(read_only = True,many = True)
    ca me sort une erreur
    TypeError at /Deplace/CoursesApi/
    'lieux' object is not iterable
    si je peux rajouter plus dites le moi , et merci pour votre aide car vraiment j'en ai besoin

  6. #6
    Membre très actif Avatar de animalx123
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Janvier 2015
    Messages
    148
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Janvier 2015
    Messages : 148
    Par défaut
    âpres tant d'effort et de recherches et de testes je viens de trouver la solution qui était si simple ,et qui consistait a ne pas donner d'arguments au sérialiseur lieux_json :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class trajet_json(serializers.ModelSerializer):
     
        arret = lieux_json()
     
        class Meta :
            model = trajet
            fields = ('__all__')
    merci de votre aide en tout les cas,et mes salutations

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lancer un programme avec des arguments via IE...
    Par petozak dans le forum Général Conception Web
    Réponses: 6
    Dernier message: 24/03/2006, 11h51
  2. Réponses: 3
    Dernier message: 21/03/2006, 10h37
  3. [débutant] problème avec les arguments de fopen
    Par Anouschka dans le forum C++
    Réponses: 13
    Dernier message: 23/02/2006, 14h56
  4. Réponses: 4
    Dernier message: 20/11/2005, 05h48
  5. Lister les process avec leurs arguments
    Par jamfr73 dans le forum MFC
    Réponses: 5
    Dernier message: 23/12/2004, 10h54

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