为什么Django REST Framework嵌套的序列化程序self.instance总是返回None?

时间:2018-08-11 11:18:18

标签: python django django-rest-framework

我有模特,

class Profile(models.Model)
   user = models.OneToOneField(User)

我的序列化器类是

class UserSerializer(serializers.ModelSerializer):

   def validate(self, attrs):
       print(self.instance) # Always prints None
       print(self.parent.instance.user) # Prints User instance
       return attrs

   class Meta:
       model = User

class ProfileSerializer(serializer.ModelSerializer):
   user = UserSerializer()

   class Meta:
      Model = Profile

还有我的视图类,

class ProfileView(APIView):
   def update(self, request):
      profile = ProfileSerializer(request.user.profile, data=request.data, partial=True)
      if profile.is_valid():
          profile.save()
          return Response(status=HTTP_204_NO_CONTENT)
      return Response({'error': profile.errors}, status=status.HTTP_400_BAD_REQUEST)

为什么嵌套序列化器的self.instance方法内的validate()始终不返回?

3 个答案:

答案 0 :(得分:1)

何时看到?在创作时?

在这种情况下,将在 save()方法内填充 self.instance ,并在 create()方法后调用结果。 validate()。

此处< / a>您可以阅读

  

将初始对象或查询集传递给序列化程序实例时,该对象将作为.instance可用。如果没有传递初始对象,则.instance属性将为None。

答案 1 :(得分:0)

在子序列化器中,可以使用parent字段而不是instance字段访问实例,如下所示:

        if self.parent is not None and self.parent.instance is not None:
            instance = getattr(self.parent.instance, self.field_name)
            check_query = check_query.exclude(pk=user.pk)

答案 2 :(得分:0)

似乎您需要在父级中进行验证

https://www.django-rest-framework.org/api-guide/validators/#updating-nested-serializers

对于嵌套序列化程序的更新操作,由于实例不可用,因此无法应用此排除。

同样,您可能想要从序列化器类中显式删除验证器,并在.validate()方法或视图中显式编写验证约束的代码。