Django REST嵌套对象验证
我的数据库:Django REST嵌套对象验证,django,django-rest-framework,Django,Django Rest Framework,我的数据库: User ----------------------------------- id | name ----------------------------------- 1 | Phuong Vu ----------------------------------- Profile ----------------------------------- user_id | phone_number --------------------------------
User
-----------------------------------
id | name
-----------------------------------
1 | Phuong Vu
-----------------------------------
Profile
-----------------------------------
user_id | phone_number
-----------------------------------
1 | 123456
-----------------------------------
我的模型:
class User(models.Model):
id = models.AutoField(primary_key=True)
name = models.CharField(max_length=100)
class Profile(models.Model):
user = models.OneToOneField(User, primary_key=True)
phone_number = models.CharField(max_length=15, unique=True, blank=True)
我的序列化程序:
class ProfileSerializer(serializers.ModelSerializer):
def validate(self, attrs):
##################################
# I want get current instance here
##################################
print self.instance
return attrs
class Meta:
model = Profile
class UserSerializer(serializers.ModelSerializer):
profile = ProfileSerializer(many=False)
class Meta:
model = User
在我看来,我通过两种方式调用is_valid 2次以进行测试:
profile_data = {
'phone_number':'123456'
}
user = User.objects.get(pk=1)
profile = Profile.objects.get(user_id=1)
setattr(user, 'profile', profile)
data = {
'profile': profile_data
}
serializer = UserSerializer(
user,
data=data,
partial=True
)
# This said 'Profile phone number is exist'
# because ProfileSerialiser.instance is None
serializer.is_valid()
# This is fine because ProfileSerialiser.instance is not None
profile_serialiser = ProfileSerialiser(profile, data=profile_data, partial=True)
profile_serializer.is_valid()
创建序列化程序实例后,UserSerializer.instance
不是None
,而是子ProfileSerializer.instance
是None
那么我如何解决这个问题呢?(通过
UserSerialiser
创建后,在ProfileSerializer
中访问self.instance
)出于好奇,您是否可以添加异常?您提到您访问了ProfileSerializer.instance
,但它不在您的代码中。你在哪里访问它?例如@iulianProfileSerializer->def validate(self,attrs):传递
,在这个方法中,我想检查新实例(self.instance为None
)或来自数据库(self.instance非None
)@Wtower在数据库配置文件中(pk=1)。电话号码等于123456
。如果我通过ProfileSerialiser
进行验证,就可以了。但是当我通过UserSerialize
验证时,它显示电话号码已经存在(因为通过UserSerializer构建的ProfileSerializer.instance
我猜是没有的)。请通过编辑来发布问题中的任何附加信息,并在评论中避免这样做。