Skip to main content
 首页 » 编程设计

python之在 Django Rest Framework 中使用嵌套序列化程序进行序列化程序字段验证

2025年05月04日35grandyang

我有一个模型 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()方法。