Django Rest Framework创建Profile实例而不是更新Profile

时间:2017-10-09 23:49:24

标签: python django django-rest-framework

我想通过向url update_profile /

发送数据来更新用户的Profile实例

我正在使用:

curl -X PUT -H "Authorization: Token sometoken" -d "name=somename&age=20&user=1" 127.0.0.1:8000/update_profile/

我得到的错误是:{"用户":["此字段必须是唯一的。"]}

似乎错误的发生是因为请求创建了一个新的Profile实例,当已经有另一个Profile实例与该用户相同时。但我只是想为用户更新当前的Profile实例。知道为什么我的代码会尝试创建一个新实例而不是更新它吗?

views.py

class UserProfileChangeAPIView(generics.UpdateAPIView, mixins.UpdateModelMixin):

    permission_classes = (
    permissions.IsAuthenticated,
    UserIsOwnerOrReadOnly,
    )
    serializer_class = UpdateProfileSerializer
    parser_classes = (MultiPartParser, FormParser,)

    def get_queryset(self, *args, **kwargs):
        queryset = Profile.objects.filter(user=self.request.user)
        return queryset

    def get_object(self):
        self.request.user.profile

    def put(self, request, *args, **kwargs):
        return self.update(request, *args, **kwargs)

    def delete(self, request, *args, **kwargs):
        return self.destroy(request, *args, **kwargs)

    def update(self, request, pk=None):
        try:
            self.request.user.profile

        except Http404:
            return Response(
                {'detail': 'Not found'}, status=status.HTTP_404_NOT_FOUND)
        return super(UserProfileChangeAPIView, self).update(request, pk)

urls.py

     url(r'^update_profile/$', UserProfileChangeAPIView.as_view(), name='update_profile'),

serializers.py

 class UpdateProfileSerializer(serializers.ModelSerializer):
    class Meta:
        model = Profile
        fields = [
            'name',
            'age',
            'user',
        ]

models.py

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE)
    name = models.CharField(max_length=100, null=True)
    age = models.PositiveIntegerField(null=True)

2 个答案:

答案 0 :(得分:0)

您不应在帖子数据中加入user,因为您已在get_object()get_queryset()

获取当前登录用户的个人资料

由于个人资料和用户之间的关系是OnetoOneField,因此不能有多个Profile链接到同一个User

我希望(根据您收到的错误)这里发生的事情是您以一个User(例如ID 3)登录,然后尝试更新Profile以指向{{ 1}} id 1。

答案 1 :(得分:0)

我能够像这样解决问题,并且不需要在网址中使用pk:

serializers.py

class ProfileUpdateAPIView(UpdateAPIView):
    serializer_class = UpdateProfileSerializer

    def get_object(self):
        queryset = Profile.objects.filter(user=self.request.user)
        obj = queryset[0]
        return obj

views.py

url(r'^update/$', ProfileUpdateAPIView.as_view(), name='update'),

urls.py:

 curl -X PUT  -H "Authorization: Token sometoken" -d "name=newname&age=20" 127.0.0.1:8000/update/

卷曲:

table_users = $ ('#table_current_user').DataTable 
({
    processing: true, 
    Serverside: true, 
    scrollX: true, 
    Paginate: true,
})