2016-08-04 18 views
2

Ich habe ein Modell Manager, die einen ForeignKey zu einem User hat. einen Spediteur zu aktualisieren, ich sende PATCH Methode mit verschachtelten Objekten wie {"user": {"first_name": "John", "last_name": "Doe", "email": "[email protected]"}Serializer-Feldvalidierung mit verschachtelten Serialisierer in 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",) 

Das war alles gut funktioniert, bis ich einen Validator auf das email Feld der UserMeSerializer hinzugefügt:

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') 

Nun ist die Die Validierung schlägt fehl, weil der UserMeSerializer den Parameter instance nicht erhält. Daher weiß die eindeutige Überprüfung nicht, dass die gefundene E-Mail-Adresse die Adresse ist, die wir prüfen ... see the source of UniqueValidator

Also meine Frage ist: Wie kann ich dem UserMeSerializer sagen, dass ich an der companymanager.user Instanz arbeite? Sollte ich is_valid überschreiben?

Antwort

-1

Ich glaube, das Schreiben eines benutzerdefinierten Validators UniqueValidator würde helfen. Sie können den Kontext überprüfen und self.instance entsprechend einstellen. Dafür müssen Sie die Methode set_context() implementieren.