django rest框架保存序列化程序使用post方法失败
我正在尝试使用post方法更新配置文件对象,但在尝试保存序列化程序时收到错误消息:django rest框架保存序列化程序使用post方法失败,post,save,django-rest-framework,serialization,Post,Save,Django Rest Framework,Serialization,我正在尝试使用post方法更新配置文件对象,但在尝试保存序列化程序时收到错误消息: You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead. 我的看法是: class SettingsProfileView(AP
You cannot call `.save()` after accessing `serializer.data`.If you need to access data before committing to the database then inspect 'serializer.validated_data' instead.
我的看法是:
class SettingsProfileView(APIView):
"""
Get and update user profile
"""
queryset = models.UserProfile.objects.all()
serializer_class = serializers.UserProfileSerializer
renderer_classes = [TemplateHTMLRenderer]
template_name = 'base_/settings/profile.html'
def get_object(self, pk):
try:
return models.UserProfile.objects.get(pk=pk)
except models.UserProfile.DoesNotExist:
raise Http404
def get(self, request, format=None):
if not request.user.is_authenticated:
return Response({"error": _("User is not connected")}, status=status.HTTP_511_NETWORK_AUTHENTICATION_REQUIRED)
try:
profile = request.user.profile
except models.UserProfile.DoesNotExist:
profile = models.UserProfile(user=request.user)
profile.key_name = request.user.username
profile.save()
profile = self.get_object(request.user.profile.id)
serializer = serializers.UserProfileSerializer(profile)
return Response({'serializer': serializer, 'profile': profile})
def post(self, request, format=None):
serializer = serializers.UserProfileSerializer(data=request.data)
if serializer.is_valid():
serializer.save()
return Response(serializer.data, status=status.HTTP_201_CREATED)
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
此部分中出现错误:serializer.save()
在我的post方法中。是因为序列化程序正在其指令方法中访问数据吗?
我的序列化程序非常基本,没有特殊代码:
class UserProfileSerializer(serializers.ModelSerializer):
class Meta:
model = UserProfile
fields = ('user', 'coachs', 'is_coach', 'gender', 'weight', 'height', 'visibility', )
也许问题是因为我使用post methode而不是update
编辑(在@pleasedontalley post之后):
我尝试过使用通用视图:
class SettingsProfileView(generics.GenericAPIView):
但是update方法没有被触发(因为我来自一篇HTML文章),所以我不得不手动启动update方法,如下所示:
def post(self, request, *args, **kwargs):
return self.update(request, *args, **kwargs)
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object(request.user.profile.id)
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
但是错误仍然是一样的。
我找不到任何使用django rest by post方法更新对象的示例。这是因为这不是一个好的继续方法吗?最好使用通用视图,它可以防止您重写所有这些代码。但是,如果您愿意手动执行,则可以始终检查源代码以检查其执行方式: 必须将UserProfile实例传递给序列化程序 顺便说一句:您应该/必须使用PUT或PATCH进行更新,POST用于创建对象
希望这有帮助:)最好使用通用视图,这样可以防止您重写所有这些代码。但是,如果您愿意手动执行,则可以始终检查源代码以检查其执行方式: 必须将UserProfile实例传递给序列化程序 顺便说一句:您应该/必须使用PUT或PATCH进行更新,POST用于创建对象
希望这有帮助:)经过数小时的调试,问题似乎来自Visual Studio的断点。删除断点后,它工作正常。
可能Visual Studio试图读入serializer.data,然后影响它们。经过数小时的调试后,问题似乎来自Visual Studio的断点。删除断点后,它工作正常。
可能Visual Studio试图读入serializer.data,然后影响它们。谢谢@PleasedOnAttery我用您的建议编辑了问题,但仍然有相同的错误。谢谢@PleasedOnAttery我用您的建议编辑了问题,但仍然有相同的错误。
class UpdateModelMixin(object):
"""
Update a model instance.
"""
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
return Response(serializer.data)
def perform_update(self, serializer):
serializer.save()
def partial_update(self, request, *args, **kwargs):
kwargs['partial'] = True
return self.update(request, *args, **kwargs)