Django Rest Framework 更新字段
Django Rest Framework update field
我是 DRF 的新手,我正在尝试编写自定义视图/序列化程序,我可以使用它来更新用户对象的一个字段。
我需要制定逻辑来更新用户的 "name"。
我写了序列化器:
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
从未调用此方法。我尝试在那里设置断点并调试它,但它从未被调用,即使我使用 PUT、POST 或 PATCH 方法也是如此。如果我添加 create 方法,它在我使用 POST.
时被调用
我的观点是这样的:
class UpdateName(generics.CreateAPIView):
queryset = ClientUser.objects.all()
serializer_class = ClientNameSerializer
permission_classes = (permissions.IsAuthenticated,)
有人有什么建议吗?谢谢!
我的models.py看起来像这样
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)
端点可以接受哪些方法的定义是在视图中完成的,而不是在序列化程序中。
您在序列化程序下的更新方法需要移到您的视图中,这样您就会有类似的内容:
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)
请注意,您正在覆盖 UpdateModelMixin,您可能需要稍微更改上面的代码才能使其正确。
如果您使用 class UpdateName(generics.CreateAPIView)
,这只会调用序列化程序的 create()
方法。
您应该继承 generics.UpdateAPIView
。就是这样。
您不必将您的方法移动到视图中 (它基本上是 copying/duplicating UpdateModelMixin 的更新方法)
有关序列化程序如何工作的更多信息 saving/updating 请参阅此处的文档:
另一种方法可能是以下方法:
serializer.py
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
views.py
class UpdateName(generics.UpdateAPIView):
queryset = ClientUser.objects.all()
serializer_class = ClientNameSerializer
permission_classes = (permissions.IsAuthenticated,)
def update(self, request, *args, **kwargs):
data_to_change = {'name': request.data.get("name")}
# Partial update of the data
serializer = self.serializer_class(request.user, data=data_to_change, partial=True)
if serializer.is_valid():
self.perform_update(serializer)
return Response(serializer.data)
我是 DRF 的新手,我正在尝试编写自定义视图/序列化程序,我可以使用它来更新用户对象的一个字段。
我需要制定逻辑来更新用户的 "name"。
我写了序列化器:
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
从未调用此方法。我尝试在那里设置断点并调试它,但它从未被调用,即使我使用 PUT、POST 或 PATCH 方法也是如此。如果我添加 create 方法,它在我使用 POST.
时被调用我的观点是这样的:
class UpdateName(generics.CreateAPIView):
queryset = ClientUser.objects.all()
serializer_class = ClientNameSerializer
permission_classes = (permissions.IsAuthenticated,)
有人有什么建议吗?谢谢!
我的models.py看起来像这样
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)
端点可以接受哪些方法的定义是在视图中完成的,而不是在序列化程序中。
您在序列化程序下的更新方法需要移到您的视图中,这样您就会有类似的内容:
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)
请注意,您正在覆盖 UpdateModelMixin,您可能需要稍微更改上面的代码才能使其正确。
如果您使用 class UpdateName(generics.CreateAPIView)
,这只会调用序列化程序的 create()
方法。
您应该继承 generics.UpdateAPIView
。就是这样。
您不必将您的方法移动到视图中
有关序列化程序如何工作的更多信息 saving/updating 请参阅此处的文档:
另一种方法可能是以下方法:
serializer.py
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
views.py
class UpdateName(generics.UpdateAPIView):
queryset = ClientUser.objects.all()
serializer_class = ClientNameSerializer
permission_classes = (permissions.IsAuthenticated,)
def update(self, request, *args, **kwargs):
data_to_change = {'name': request.data.get("name")}
# Partial update of the data
serializer = self.serializer_class(request.user, data=data_to_change, partial=True)
if serializer.is_valid():
self.perform_update(serializer)
return Response(serializer.data)