2015-07-01 9 views
17

Jestem nowy w DRF i próbuję napisać niestandardowy widok/serializer, którego mogę użyć do aktualizacji tylko jednego pola obiektu użytkownika.Pole aktualizacji Django Rest Framework

Potrzebuję logiki tylko po to, aby zaktualizować "nazwę" użytkownika.

pisałem serializatora:

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 

Metoda ta nigdy nie jest wywoływana. Próbowałem ustawić tam punkt przerwania i debugować go, ale nigdy nie jest wywoływany, nawet jeśli używam metod PUT, POST lub PATCH. Jeśli dodaję , stwórz metodę, która jest wywoływana, gdy używam POST.

Tak moim zdaniem wygląda następująco:

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

Czy ktoś ma jakieś sugestie? Dzięki!

Moja models.py wygląda to

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

Czy można również dodać kod dla "models.py". –

+0

@RahulGupta Dodałem mój model. Dzięki! – bla0009

Odpowiedz

14

Definicja jakie metody punkt końcowy może zaakceptować odbywa się w widoku, a nie w serializatora.

Metoda aktualizacji masz pod serializatora musi być przeniesiona do widoku więc masz coś takiego:

# 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) 

zwrócić uwagę, że jesteś przesłanianie UpdateModelMixin i może trzeba zmienić powyżej trochę kodu, żeby to naprawić.

+0

Dzięki, wypróbuję to dziś wieczorem i potwierdzę, czy to działa! – bla0009

+0

Witaj, metoda aktualizacji łamie się w tym wierszu: 'instance = self.get_object()' – bla0009

+0

To jest błąd, który otrzymałem: 'Oczekiwany widok UpdateName do wywołania z argumentem słowa kluczowego URL o nazwie" pk ". Napraw conf adresu URL lub ustaw atrybut .lookup_field na widoku ' – bla0009