【发布时间】:2020-12-24 15:33:28
【问题描述】:
在我的 django 项目中,我有 2 个相关模型:
class User(AbstractUser):
email = models.EmailField(
verbose_name='e-mailaddress',
max_length=255,
unique=True)
# other props not important
class Profile(models.Model):
user = models.OneToOneField(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)
#other props not important
对于创建和检索,在序列化器中将 User 作为嵌套对象很方便:
class ProfileSerializer(serializers.ModelSerializer):
user = UserSerializer()
class Meta:
model = Profile
fields = '__all__'
def create(self, validated_data):
user_data = validated_data.pop('user')
user = User.objects.create(**user_data)
user.save()
# because of reasons, an empty profile is created on initial save. This works, trust me
d, _ = Profile.objects.update_or_create(user=user, defaults=validated_data)
d.save()
return d
但是。我也希望能够采取的一项行动是同时更新配置文件和用户的两个属性。使用我的序列化程序执行此操作时,serializer.is_valid() 失败,因为提供的电子邮件已存在于数据库中。这也表明,即使验证通过(即由于更新的电子邮件地址),也会创建一个新的用户对象并将其耦合到配置文件。所以我的问题是:
如何使序列化程序的验证检查嵌套对象的编辑是否有效,而不是检查是否可以创建新对象?
【问题讨论】:
标签: python django django-rest-framework one-to-one