![](/img/trans.png)
[英]Unique validation on nested serializer on 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",)
一切正常,直到我在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
參數,因此唯一檢查不知道它找到的電子郵件地址就是我們正在檢查的電子郵件地址... 請參見UniqueValidator的來源
所以我的問題是:我怎么能告訴UserMeSerializer
是我工作的companymanager.user
實例? 我應該覆蓋is_valid
嗎?
我相信編寫一個擴展UniqueValidator
的自定義驗證器會有所幫助。 您可以檢查上下文並相應地設置self.instance
。 為此,您必須實現set_context()方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.