提前感谢您的关注。
目标:
简而言之:仅当单个视图发生更改时才更新 django 用户对象和自定义用户配置文件对象。
问题:
对于初学者来说,这是我第一次尝试做这样的事情,所以它可能非常简单,我只是忽略了它。
它似乎在验证步骤上失败了,我收到一个 HTTP 400 错误,说“用户名必须是唯一的”,即使我没有发送会更改当前用户用户名的更改。现在我可以使用 django-rest-auth 内置的视图来更新用户部分,然后只创建一个只更新配置文件的自定义视图。但这似乎很笨拙和愚蠢,但是如果这是要走的路,那么我会这样做。
我尝试过的事情:
- 尝试了puts和patch。结果相同。
- 如果用户名字段相同,则尝试覆盖 put 和 patch 方法以从
request.data
验证之前删除用户名字段,但这给出了另一个错误,表明它是必需的。 - 尝试覆盖序列化程序中的更新方法,遇到了一个我不知道如何更新嵌套字段的问题。
- 谷歌搜索无止境。
- 考虑编写自定义验证器。但我不知道从哪里开始,我想让它尽可能简单,并且更喜欢内置的东西。
序列化器:
class UserSerializer(ModelSerializer):
class Meta(UserDetailsSerializer.Meta):
model = User
fields = ('username', 'email', 'first_name', 'last_name')
read_only_fields = ('email', )
class UserProfileSerializer(ModelSerializer):
user = UserSerializer(required=True, many=False)
games = UserGameProfileSerializer(required=False, many=True)
class Meta:
model = UserProfile
fields = ('premium', 'user', 'games')
看法:
class UserProfileUpdateView(generics.UpdateAPIView):
# authentication_classes = (authentication.TokenAuthentication,)
# permission_classes = (permissions.IsAuthenticated,)
serializer_class = UserProfileSerializer
def get_queryset(self):
return UserProfile.objects.filter(user__username__exact=self.request.user).all()
def get_object(self):
return UserProfile.objects.filter(user__username__exact=self.request.user).get()