2016-09-20 25 views
5

मेरे पास एक विदेशी कुंजी के साथ एक मॉडल के लिए एक धारावाहिक है। आवश्यकता यह है कि बनाने पर, विदेशी कुंजी को संबंधित मॉडल से किसी भी मौजूदा ऑब्जेक्ट पर सेट किया जा सकता है, लेकिन अद्यतन पर संबंधित ऑब्जेक्ट को बदला नहीं जा सकता है। मैं इसे कस्टम update() में देख सकता हूं, लेकिन यह जांचने के लिए सीरियलाइज़र सत्यापन का उपयोग करने के लिए और अधिक सुरुचिपूर्ण होगा? लेकिन मुझे यकीन नहीं है कि कैसे। उदाहरण कोड:डीआरएफ में अपडेट पर फ़ील्ड को कैसे सत्यापित करें?

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 अगर है ओवरराइड करने के लिए है। यह 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 
संबंधित मुद्दे