2016-08-04 83 views
2

我有一個模型Manager,它的外鍵爲User。 要更新託運人,我送一個PATCH方法與嵌套的對象,如{"user": {"first_name": "John", "last_name": "Doe", "email": "[email protected]"}在Django Rest Framework中使用嵌套序列化器進行序列化器字段驗證

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參數,所以唯一檢查並不知道它找到的電子郵件地址是我們正在檢查的電子郵件地址... see the source of UniqueValidator

所以我的問題是:我如何告訴UserMeSerializer我正在研究companymanager.user實例?我應該覆蓋is_valid嗎?

回答

-1

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

相關問題