2015-07-01 27 views
17

Tôi mới dùng DRF và tôi đang cố gắng viết trình xem/serializer tùy chỉnh mà tôi có thể sử dụng để cập nhật chỉ một trường đối tượng người dùng.Trường cập nhật khung Django

Tôi cần thực hiện logic chỉ để cập nhật "tên" của người dùng.

tôi đã viết serializer:

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 

Phương pháp này không bao giờ được gọi. Tôi đã thử đặt breakpoint ở đó và gỡ lỗi nó, nhưng nó không bao giờ được gọi, ngay cả khi tôi sử dụng các phương thức PUT, POST hoặc PATCH. Nếu tôi thêm , hãy tạo phương thức mà nó đang được gọi khi tôi sử dụng POST.

Đây là cách nhìn của tôi trông giống như:

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

Có ai có một số gợi ý? Cảm ơn!

My models.py trông như thế này

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

Bạn cũng có thể thêm mã cho 'models.py' hay không. –

+0

@RahulGupta Tôi đã thêm mô hình của mình. Cảm ơn! – bla0009

Trả lời

14

Định nghĩa của những gì các phương pháp thiết bị đầu cuối có thể chấp nhận được thực hiện trong giao diện, không phải trong serializer.

Phương pháp cập nhật bạn có theo serializer của bạn cần phải được di chuyển vào tầm nhìn của bạn, do đó bạn sẽ có cái gì đó như:

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

Hãy lưu ý rằng bạn đang trọng các UpdateModelMixin và bạn có thể cần phải thay đổi ở trên mã một chút để làm cho nó đúng.

+0

Cảm ơn, tôi sẽ thử nó tối nay và xác nhận nếu nó hoạt động! – bla0009

+0

Xin chào, cập nhật ngắt phương thức trên dòng này: 'instance = self.get_object()' – bla0009

+0

Đây là lỗi mà tôi nhận được: 'Mong đợi view UpdateName được gọi với đối số từ khóa URL có tên là" pk ". Sửa lỗi URL của bạn hoặc đặt thuộc tính .lookup_field trên chế độ xem chính xác' – bla0009

Các vấn đề liên quan