我有一个模型 Manager,它有一个指向 User 的 ForeignKey。 为了更新托运人,我发送了一个带有嵌套对象的 PATCH 方法,例如 {"user": {"first_name": "John", "last_name": "Doe", "email": “john@doe.com”
class CompanyManagerMeSerializer(serializers.ModelSerializer):
user = UserMeSerializer()
company = CompanyFullSerializer()
def update(self, instance, validated_data):
user_data = validated_data.pop('user', {})
user = instance.user
for key, val in user_data.items():
setattr(user, key, val)
user.save()
company_data = validated_data.pop('company', {})
company = instance.company
for key, val in company_data.items():
setattr(company, key, val)
company.save()
for key, val in validated_data.items():
setattr(instance, key, val)
instance.save()
return instance
class Meta:
model = CompanyManager
fields = ("pk", "user", "company", "display_name")
read_only_fields = ("display_name",)
一切正常,直到我在 UserMeSerializer 的 email 字段上添加了一个验证器:
class UserMeSerializer(serializers.ModelSerializer):
email = serializers.EmailField(
validators=[UniqueValidator(
queryset=User.objects.all(),
message=_("This email address is already used.")
)]
)
class Meta:
model = User
fields = (
'pk', 'first_name', 'last_name', 'username', 'email', 'date_joined', 'last_login'
)
read_only_fields = ('pk', 'date_joined', 'last_login')
现在验证将失败,因为 UserMeSerializer 没有获得 instance 参数,所以唯一检查不知道它找到的电子邮件地址是我们正在检查的地址...... see the source of UniqueValidator
所以我的问题是:如何告诉 UserMeSerializer 我正在处理 companymanager.user 实例?我应该覆盖 is_valid 吗?
请您参考如下方法:
我相信编写一个扩展 UniqueValidator 的自定义验证器会有所帮助。 您可以检查上下文并相应地设置 self.instance。为此,您必须实现 set_context()方法。
