在一个请求中更新用户个人资料和用户

时间:2015-05-20 17:07:37

标签: django python-2.7 serialization django-rest-framework django-rest-auth

提前感谢您的期待。

目标:

简而言之:只有在单个视图发生更改时才更新django用户对象和自定义用户配置文件对象。

问题:

对于初学者来说,这是我第一次尝试做这样的事情,所以它可能是非常简单的东西,我只是忽略它。

似乎验证步骤失败了,我收到HTTP 400错误,说''用户名必须是唯一的',即使我没有发送更改当前用户用户名的更改。现在我可以使用django-rest-auth中内置的视图来更新用户部分,然后只创建一个仅更新配置文件的自定义视图。但这似乎是愚蠢和愚蠢的,但如果是这样的话,我会去做。

我尝试过的事情:

  • 尝试了推杆和补丁。结果相同。
  • 尝试覆盖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()

1 个答案:

答案 0 :(得分:0)

<强>声明

我终于能够弄清楚了,我只是回答以备参考。我不确定这是最佳实践还是完成任务的最简单方法。然而,这是我能够想到的。

我将视图更改为更简单,而不是那个令人讨厌的过滤器查询我发现我可以做一个get对象,然后说user=self.request.user,这将得到我需要的东西。

查看

class UserProfileUpdateView(generics.UpdateAPIView):
    authentication_classes = (authentication.TokenAuthentication,)
    permission_classes = (permissions.IsAuthenticated,)
    serializer_class = UserProfileSerializer

    def get_object(self):
        return UserProfile.objects.get(user=self.request.user)

然后在序列化器中,我想出了如何更新嵌套对象,这正是需要完成的工作。现在我意识到目前我只是真正更新内置的django对象。但很快我将向用户配置文件中添加更多字段,并需要更新这些字段,如果用户对象发生了更改,我想在同一请求中更新它们。

在更新功能中,您可以使用self.data访问请求数据,在那里我可以访问包含用户信息的dict。通过这个我能够查询用户对象,然后使用UserSerializer我能够验证数据并调用更新传递我查询的用户和来自序列化器的验证数据。

<强>串行

class UserProfileSerializer(ModelSerializer):
    user = UserSerializer(required=True, many=False)
    games = UserGameProfileSerializer(required=False, many=True)

    class Meta:
        model = UserProfile
        fields = ('premium', 'user', 'games')
        read_only_fields = ('premium', )

    def update(self, instance, validated_data):
        user_data = validated_data.pop('user')
        game_data = validated_data.pop('games')
        username = self.data['user']['username']
        user = User.objects.get(username=username)
        print user
        user_serializer = UserSerializer(data=user_data)
        if user_serializer.is_valid():
            user_serializer.update(user, user_data)
        instance.save()
        return instance