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 :

Django Rest - Créer et mettre un objet avec un clé étrangère [Python 3.X]


Sujet :

Django Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Par défaut Django Rest - Créer et mettre un objet avec un clé étrangère
    Bonjour

    Je voudrais créer des API avec django REST Framework
    Je veux faire une API qui retourne des offres. Une offre a un statut avec un code et un libellé
    J'ai créé un model pour les statuts et un pour les offres avec une clé étrangère vers les statuts


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    class Status(models.Model):
        code = models.CharField(max_length=5, unique=True)
        Label = models.CharField(max_length=128)
     
    class Offers(models.Model):
        appelation = models.CharField(max_length=256)
        year = models.IntegerField()
        typeOffer = models.CharField(_("type"), max_length=128)
        volume = models.FloatField()
        price = models.FloatField()
        location = models.CharField(max_length=256)
        status = models.ForeignKey(Status, related_name='statut', on_delete=models.DO_NOTHING)
    J'ai créé deux serializers

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class StatusSerializer(serializers.ModelSerializer):
     
        class Meta:
            model = Status
            fields = ("__all__")
     
    class OfferSerialzer(serializers.ModelSerializer):
     
        status = StatusSerializer()    
     
        class Meta:
            model = Offers
            fields = ('id','appelation','year','typeOffer','volume','price','location','status')
    Quand j'exécute mon API ("http://localhost:8000/offers/") pour retrouver mes offres, j'obtiens ceci et qui me va très bien (car ça permet à mon front en React d'avoir toutes les infos)

    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
     
    [
        {
            "id": 1,
            "appelation": "Chénas",
            "year": 1950,
            "typeOffer": "Vrac",
            "volume": 130.0,
            "price": 2600.0,
            "location": "Grenot",
            "status": {
                "id": 1,
                "code": "WAIT",
                "Label": "En attente de validation"
            }
        }
    ]
    Je ne sais comment faire pour créer ne nouvelle offre en faisant référence à un statut existant. Quand je créé une offre, elle doit avoir un statut par défaut
    Comment faire aussi quand je vais vouloir mettre à jour le statut de mon offre

    Quand je vais appeler mon api "http://localhost:8000/offers/" en POST, est ce que je dois lui passer l'id d'un statut ? Si oui, faut-il modifier mon serializer pour ajouter l'ID du statut ?

    Merci pour votre aide

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 132
    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 132
    Par défaut
    est ce que je dois lui passer l'id d'un statut
    Oui au moins, ou autre chose qui distingue chaque offre...

  3. #3
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Par défaut
    Mais je ne vois pas comment modifier mon serializer pour passer uniquement l'id d'un statut quand je fais un POST et conserver en même temps la structure actuelle de la réponse lorsque je fait une GET

  4. #4
    Membre éclairé
    Inscrit en
    Mars 2007
    Messages
    221
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 221
    Par défaut
    Finalement, j'ai fait ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    status = StatusSerializer(read_only=True)    
        status_id = serializers.PrimaryKeyRelatedField(source='status', queryset=Status.objects.all())
    j'ai trouver ça ici http://sametmax.com/accepter-un-id-m...est-framework/ dans un des commentaires.

    Ca fonctionne mais est ce que c'est la bonne solution ?

  5. #5
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 132
    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 132
    Par défaut
    Je sais pas si je comprend bien ce que tu veux, mais pour faire une API et créer une réponse, dans ma vue je fais simplement,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    from django.shortcuts import HttpResponse
    from django.http import JsonResponse
    
    @csrf_exempt
    def get_offer(request, id):    #  suite du code
    
        data = {            "...": {
                    "...": "...",
                    "...": "...",
                }         }
    
        return HttpResponse(JsonResponse(data))
    et voilà je reçois mon Json, je m'embête pas trop avec ce module, je sais qu'il est beaucoup utilisé, mais je l'aime pas, je ne le trouve pas si intuitif que cela... les goûts et les couleurs.

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

Discussions similaires

  1. Créer une instance de modèle avec 2 clefs étrangères
    Par Invité dans le forum Ruby on Rails
    Réponses: 6
    Dernier message: 25/11/2011, 16h42
  2. [Flex4] Créer un objet avec code actionscript
    Par stage2009 dans le forum Flex
    Réponses: 8
    Dernier message: 19/11/2010, 09h48
  3. [BO XIr2] créer un objet avec IF THEN ELSE
    Par schkrumble dans le forum Designer
    Réponses: 3
    Dernier message: 06/08/2008, 12h25
  4. Créer des objets avec Java Monkey Engine
    Par ToTo13 dans le forum 3D
    Réponses: 3
    Dernier message: 31/07/2007, 15h06
  5. [Reflect] Créer un array d'objets avec le nom de leur classe
    Par Onarap dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 12/06/2006, 12h24

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