2

User에 대한 ForeignKey가있는 Manager 모델이 있습니다. 는 화주를 업데이트하려면, 나는 {"user": {"first_name": "John", "last_name": "Doe", "email": "[email protected]"}Django Rest Framework의 중첩 시리얼 라이저를 사용하는 serializer 필드 유효성 검사

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",) 

처럼 중첩 된 객체와 PATCH 방법을 보내기 나는 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

제 질문은 : companymanager.user 인스턴스에서 작업하고 있다고 UserMeSerializer에게 어떻게 알릴 수 있습니까? is_valid을 덮어 써야합니까?

답변

-1

UniqueValidator 확장 사용자 지정 유효성 검사기 작성하는 것이 도움이 될 것이라고 생각합니다. 컨텍스트를 확인하고 그에 따라 self.instance을 설정할 수 있습니다. 이를 위해서는 set_context() 메소드를 구현해야합니다.

관련 문제