0

J'utilise django rest framework.
J'ai deux modèles (Model1 et Model2). Chacun d'eux a:Django RetrieveUpdateAPIView ne pas mettre à jour

  • 2 serializers (Model1CreateSerializer, Model1DetailSerializer, Model2CreateSerializer, Model2DetailSerializer). Tous les sérialiseurs étendent ModelSerializer.
  • 2 vues (Model1CreateView Model1DetailView, Model2CreateView, Model2DetailView). Toutes les "... CreateView" étendre CreateAPIView et tous les "... DetailView" étendre RetrieveUpdateAPIView

Ils sont très similaires.
Le premier fonctionne correctement: Je peux créer une istance de Model1 en utilisant le Model1CreateView et je peux voir (GET) et patcher cette istance en utilisant le Model1DetailView.
Le second ne fonctionne pas: je peux créer un istance de Model1 en utilisant le Model2CreateView et je peux voir (GET) cette istance en utilisant le Model2DetailView. Cependant je n'arrive pas à mettre à jour l'istance. Aucun message d'erreur et aucune mise à jour n'est appliquée.

J'ai tout essayé. J'ai écrit un nouveau modèle, Serializers, Views et table dans la base de données à partir de zéro et il ne fonctionne toujours pas.
J'ai même réduit les champs et j'ai juste gardé un seul champ Charfield dans Model2 juste pour voir si un champ était la cause du problème.

Model1

class Model1(models.Model): 
    Field1 = models.CharField(max_length=255) 
    Field2 = models.CharField(unique=True, max_length=10, blank=True, null=True) 
    Field3 = models.SmallIntegerField() 
    description = models.CharField(max_length=3000, blank=True, null=True) 
    Field4 = models.SmallIntegerField() 
    Field5 = models.ForeignKey('Foreignkey1', models.DO_NOTHING, db_column='Column1') 

    class Meta: 
     managed = False 
     db_table = 'table1' 

class Model1DetailView(RetrieveUpdateAPIView): 

    serializer_class = Model2DetailSerializer 
    lookup_field = 'id' 
    lookup_url_kwarg = 'model1_id' 
    #permission_classes = (IsAuthenticated,) 

    def get_queryset(self): 
     return Model1.objects.all() 


class Model1CreateView(CreateAPIView): 
    serializer_class = Model1CreateSerializer 

    def get_queryset(self): 
     return Model1.objects.all() 

class Model1CreateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Model1 
     fields = ('field1', 'field2', 'field3', 'field4', 'field5') 

class Model1DetailSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Model1 
     fields = ('field1', 'field2', 'field3', 'field4', 'field5') 
     read_only_fields = ('field2') 

Model2

class Model2(models.Model): 
    field1 = models.CharField(max_length=255, blank = True) 
    field2 = models.SmallIntegerField() 
    field3 = models.CharField(max_length=3000, blank=True, null=True) 

    class Meta: 
     managed = False 
     db_table = 'table2' 

class Model2DetailView(RetrieveUpdateAPIView): 
    serializer_class = Model2DetailSerializer 
    lookup_field = 'id' 
    lookup_url_kwarg = 'model2_id' 

    def get_queryset(self): 
     return Model2.objects.all() 


class Model2CreateView(CreateAPIView): 
    serializer_class = Model2CreateSerializer 

    def get_queryset(self): 
     return Model2.objects.all() 


class Model2DetailView(RetrieveUpdateAPIView): 

    serializer_class = Model2DetailSerializer 
    lookup_field = 'id' 
    lookup_url_kwarg = 'model2_id' 

    def get_queryset(self): 
     return Model2.objects.all() 


class Model2CreateView(CreateAPIView): 
    serializer_class = Model2CreateSerializer 

    def get_queryset(self): 
     return Model2.objects.all() 

Merci à l'avance.

Répondre

0

Pouvez-vous partager votre Model2DetailSerializer? Votre URL est-elle correcte? Pouvez-vous imprimer une sortie de console dans la méthode "get_queryset" pour vérifier que vous utilisez réellement la vue avec la bonne url? En outre, avec Django Rest Framework, vous devez utiliser la requête PUT/Patch et non la requête POST.