我有模特,
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()
始终不返回?
答案 0 :(得分:1)
何时看到?在创作时?
在这种情况下,将在 save()
方法内填充 self.instance
,并在 create()
方法后调用结果。 validate()。
将初始对象或查询集传递给序列化程序实例时,该对象将作为.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()方法或视图中显式编写验证约束的代码。