簡體   English   中英

在Django Rest Framework中使用嵌套序列化程序對序列化程序字段進行驗證

[英]Serializer field validation with nested serializer in Django Rest Framework

我有一個模型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",)

一切正常,直到我在UserMeSerializeremail字段上添加了驗證器:

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參數,因此唯一檢查不知道它找到的電子郵件地址就是我們正在檢查的電子郵件地址... 請參見UniqueValidator的來源

所以我的問題是:我怎么能告訴UserMeSerializer是我工作的companymanager.user實例? 我應該覆蓋is_valid嗎?

我相信編寫一個擴展UniqueValidator的自定義驗證器會有所幫助。 您可以檢查上下文並相應地設置self.instance 為此,您必須實現set_context()方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM