2016-09-20 3 views
5

외래 키가있는 모델에 대한 serializer가 있습니다. 요구 사항은 생성시 외래 키를 관련 모델의 기존 개체로 설정할 수 있지만 업데이트시에는 관련 개체를 변경할 수 없습니다. 나는 이것을 사용자 정의 update()에서 확인할 수 있지만이를 확인하기 위해 시리얼 라이저 유효성 검사를 사용하는 것이 더 우아 할까? 그러나 나는 어떻게 확신 할 수 없다. 예제 코드 :DRF에서 업데이트시 필드의 유효성을 검사하는 방법은 무엇입니까?

class Person(models.Model): 
    name = models.CharField(max_length=256) 
    spouse = models.ForeignKey(Person) 

class PersonSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Person 

    # this is how I know how to do this 
    def create(self, validated_data): 
     try: 
      spouse = Person.objects.get(pk=int(validated_data.pop('spouse'))) 
     except Person.DoesNotExist: 
      raise ValidationError('Imaginary spouses not allowed!') 
     return Person.objects.create(spouse=spouse, **validation_data) 

    def update(self, person, validated_data): 
     if person.spouse.pk != int(validated_data['spouse']): 
      raise ValidationError('Till death do us part!') 
     person.name = validation_data.get('name', person.name) 
     person.save() 
     return person 

    # the way I want to do this 
    def validate_spouse(self, value): 
     # do validation magic 

답변

7

필드의 유효성 검사를 사용하여 확실히 수행 할 수 있습니다. 업데이트 대 생성인지 확인하는 방법은 유효성 검사 기능에서 self.instance을 확인하는 것입니다. 조금 그것에 대해 언급했다 in the serializer documentation.

self.instance은 기존 개체와 값을 보유하므로 비교할 때 사용할 수 있습니다.

나는 이것이 당신의 목적을 위해 일한다고 생각 :

def validate_spouse(self, value): 
    if self.instance and value != self.instance.spouse: 
     raise serializers.ValidationError("Till death do us part!") 
    return value 

이 작업을 수행하는 또 다른 방법은 필드는 업데이트하고 READ_ONLY 경우 경우 오버라이드 (override)하는 것입니다. 이 작업은 serializer의 __init__에서 수행 할 수 있습니다. 유효성 검사기와 마찬가지로 인스턴스가 있는지, 데이터가 있는지 간단히 살펴볼 수 있습니다.

def __init__(self, *args, **kwargs): 
    # Check if we're updating. 
    updating = "instance" in kwargs and "data" in kwargs 

    # Make sure the original initialization is done first. 
    super().__init__(*args, **kwargs) 

    # If we're updating, make the spouse field read only. 
    if updating: 
     self.fields['spouse'].read_only = True 
관련 문제