2015-07-01 33 views
17

Sono nuovo in DRF e sto cercando di scrivere una vista personalizzata/serializzatore che posso utilizzare per aggiornare solo un campo dell'oggetto utente.Campo aggiornamento Django Rest Framework

Ho bisogno di fare la logica solo per aggiornare il "nome" dell'utente.

ho scritto serializzatore:

class ClientNameSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ClientUser 
     fields = ('name',) 

    def update(self, instance, validated_data): 
     instance.name = validated_data.get('name', instance.name) 
     instance.save() 
     return instance 

Questo metodo non viene mai chiamato. Ho provato a impostare il breakpoint lì e il debug, ma non viene mai chiamato, anche se uso i metodi PUT, POST o PATCH. Se aggiungo il al metodo viene chiamato quando utilizzo POST.

Ecco come il mio vista assomiglia:

class UpdateName(generics.CreateAPIView): 
    queryset = ClientUser.objects.all() 
    serializer_class = ClientNameSerializer 
    permission_classes = (permissions.IsAuthenticated,) 

Qualcuno ha qualche suggerimento? Grazie!

mio models.py assomiglia a questo

class ClientUser(models.Model): 
    owner = models.OneToOneField(User,unique=True,primary_key=True) 

    phone_number = models.CharField(validators=[PHONE_REGEX],max_length=20,unique=True) 

    name = models.CharField(max_length=100,blank=True) 
    status = models.IntegerField(default=1) 
    member_from = models.DateTimeField('member from',auto_now_add=True) 
    is_member = models.BooleanField(default=False) 
+0

È possibile aggiungere anche il codice per 'models.py'. –

+0

@RahulGupta Ho aggiunto il mio modello. Grazie! – bla0009

risposta

14

La definizione di quali metodi l'endpoint può accettare sono fatte nella vista, non nel serializzatore.

Il metodo di aggiornamento che avete sotto il vostro serializzatore deve essere spostato nella vostra vista in modo da avere qualcosa di simile:

# serializers.py 
class ClientNameSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = ClientUser 

# views.py 
class UpdateName(generics.UpdateAPIView): 
    queryset = ClientUser.objects.all() 
    serializer_class = ClientNameSerializer 
    permission_classes = (permissions.IsAuthenticated,) 

    def update(self, request, *args, **kwargs): 
     instance = self.get_object() 
     instance.name = request.data.get("name") 
     instance.save() 

     serializer = self.get_serializer(instance) 
     serializer.is_valid(raise_exception=True) 
     self.perform_update(serializer) 

     return Response(serializer.data) 

Si precisa che si sta sovrascrivendo il UpdateModelMixin e potrebbe essere necessario cambiare la sopra il codice un po 'per farlo bene.

+0

Grazie, lo proverò stasera e confermerò se funziona! – bla0009

+0

Ciao, aggiorna le interruzioni di metodo su questa riga: 'instance = self.get_object()' – bla0009

+0

Questo è l'errore che ho ricevuto: 'Visualizzazione prevista Nome Update da chiamare con un argomento parola chiave URL denominato" pk ". Correggi il tuo URL conf, o imposta correttamente l'attributo .lookup_field nella vista ' – bla0009

Problemi correlati