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 - Mettre à jour un object lors de la création d'un autre objet


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 Django Rest - Mettre à jour un object lors de la création d'un autre objet
    Bonjour,

    J'ai une table de relation entre deux objet, un utilisateur et une offre
    Lorsque l'utilisateur veut accepter une offre, je créé un enregistrement dans cette table de relation qui me permet de savoir toutes offres acceptés par l'utilisateur (ce qui correspond à ce qu'il a commandé)

    Je voudrais lors de cette association, modifier le statut de l'offre acceptée.

    Voici ce que j'ai :

    Un serializer pour l'association (commande):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class Order_UserSerializer(serializers.ModelSerializer):
     
        def create(self, validated_data):
            order_customer =  Order_Customer.objects.create(**validated_data)
            return order_customer
     
        class Meta:
            model = Order_Customer
            fields= '__all__'
    Une vue

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class Order_UserViewSet(viewsets.ModelViewSet):
        queryset = Order_Customer.objects.all()
        serializer_class = Order_UserSerializer
        permission_classes = [permissions.IsAuthenticated]
     
        def perform_create(self,serializer):
            serializer.save(customer_id=self.request.user.id)
    Si j'exécute la requête, l'association est bien créée pour l'utilisateur et l'offre commandée


    Mais je voudrais mettre à jour le statut de l'offre, j'ai essayé de faire ça pour mettre le statut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Order_UserSerializer(serializers.ModelSerializer):
     
        def create(self, validated_data):
            offer = validated_data.pop('offer')
            Offers.objects.filter(id=offer.id).update(status_id='SAMPL')
            order_customer =  Order_Customer.objects.create(**validated_data)
            return order_customer
     
        class Meta:
            model = Order_Customer
            fields= '__all__'
    mais quand j'exécute la requête



    j'ai cette erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    null value in column "offer_id" violates not-null constraint
    DETAIL:  Failing row contains (20, 2020-06-20, 2020-06-20, 1, null).

    Merci pour votre aide

  2. #2
    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
    Personne pour m'aider ...

    Si quelqu'un pouvait m'aiguiller un peu, ce serait vraiment cool

  3. #3
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par thorgal1612 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    null value in column "offer_id" violates not-null constraint
    DETAIL:  Failing row contains (20, 2020-06-20, 2020-06-20, 1, null).
    Tu as une colonne offer_id qui prend la valeur null, il faut donc ajouter une offre, mais comme je vois pas les modèles, je vois pas comment aider
    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)

  4. #4
    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 effet, ce sera surement mieux avec

    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
     
    class Offers(models.Model):
     
     
        CAPACITY = {
            ('S', "37,5"),
            ('M', '75')
        }
     
     
     
        appelation = models.ForeignKey(Appelation, related_name='offers_appelation', on_delete=models.DO_NOTHING)
        year = models.IntegerField()
        package = models.ForeignKey(Package,related_name='offer_package', on_delete=models.CASCADE, null=True)
        capacity = models.CharField(max_length=1, choices=CAPACITY, blank=True)
        created_at = models.DateField(auto_now_add=True,auto_now=False)
        modified_at = models.DateField(auto_now_add=False,auto_now=True)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class Customer(models.Model):
        user = models.OneToOneField(User, on_delete=models.CASCADE)
        company = models.ForeignKey(Company, related_name='companys', on_delete=models.CASCADE)
        offers = models.ManyToManyField(Offers, through='Offer_Customer')
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    class Offer_Customer(models.Model):
        customer=models.ForeignKey(Customer,related_name='customer', on_delete=models.CASCADE)
        offer=models.ForeignKey(Offers, related_name='offer', on_delete=models.CASCADE)
        created_at=models.DateField(auto_now_add=False,auto_now=True)
        modified_at = models.DateField(auto_now_add=False,auto_now=True)

  5. #5
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    L'erreur se trouve à quel niveau exactement (je pense qu'il y a plusieurs erreurs) ?

    J'ai l'impression que ça se trouve dans Order_UserSerializer.

    Est-ce qu'en faisant un print(offer) après ligne 5 tu as un retour ?

    Si oui, ligne 6 je ne vois pas le champ status_id dans le modèle Offers.
    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)

  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
    Merci pour tes réponses.
    Du coup, j'ai trouvé le problème venait de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    offer = validated_data.pop('offer')
    Le "pop" supprime la donnée du sérializer, j'ai remplacer par un get et ça fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    offer = validated_data.get('offer')
    Voici mon serializer qui fonctionne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    class Order_UserSerializer(serializers.ModelSerializer):
     
        def create(self, validated_data):
            offerUpdate = validated_data.get('offer')
            Offers.objects.filter(id=offerUpdate.id).update(status='SAMPL')
            order_customer =  Order_Customer.objects.create(**validated_data)
            return order_customer
     
        class Meta:
            model = Order_Customer
            fields= ('__all__')

    Ce qui me gêne en revanche c'est que la mise à jour de mon offre ce faisant même quand la création n'aboutissait pas

    Comment faire pour faire une mise à jour uniquement si la création est un succès ?

  7. #7
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 823
    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 823
    Points : 7 119
    Points
    7 119
    Par défaut
    Citation Envoyé par thorgal1612 Voir le message
    Comment faire pour faire une mise à jour uniquement si la création est un succès ?
    Bonsoir,

    En utilisant les signaux mais d'autres solutions existent...
    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)

Discussions similaires

  1. [Débutant] Ajouter une liste d'objet lors de la création d'un autre objet
    Par Andromedae93 dans le forum ASP.NET MVC
    Réponses: 1
    Dernier message: 01/08/2019, 10h45
  2. Réponses: 0
    Dernier message: 07/12/2016, 13h43
  3. mettre à jour un élément d'une frame à partir d'une autre
    Par Nulenprogra dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 02/10/2007, 22h16
  4. Réponses: 1
    Dernier message: 20/03/2007, 08h58
  5. Réponses: 7
    Dernier message: 12/07/2006, 17h34

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