我想通过向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)
答案 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,
})