DRF : Получение вложенных полей сериализатора для пользовательских проверок

Вот мой главный и детальный сериализаторы.

class MasterSerializer(serializers.ModelSerializer):
  
     class Meta:
         model = Master
         fields = ['id','date_signed','info1','info2']

class DetailSerializer(serializers.ModelSerializer):
     master = MasterSerializer(read_only=True)

     class Meta:
         model = Detail
         fields = ['id','master','date_start','date_end','info3','info4'...]

     def validate(self, attrs):
         # 1. check if date sign is always grater than date start
         # 2. check date start is greater than date end

Я пытаюсь проверить, всегда ли дата_подписи в главном сериализаторе является датой, предшествующей дате_начала. Для этого мне нужна дата_подписи в детальном сериализаторе. Так как я могу его получить. Возможно, это более простой вопрос, но я нахожу его трудным, так как только начал изучать drf. Я много искал, но не смог найти нужного решения.

Надеюсь получить помощь, чтобы направить меня в правильном направлении.

Заранее спасибо

Если вы хотите использовать контекст для master_id.

class MasterSerializer(serializers.ModelSerializer):
  
     class Meta:
         model = Master
         fields = ['id','date_signed','info1','info2']

class DetailSerializer(serializers.ModelSerializer):
     master = MasterSerializer(read_only=True)

     class Meta:
         model = Detail
         fields = ['id','master','date_start','date_end','info3','info4'...]

     def validate(self, attrs):
         # 1. check if date sign is always grater than date start
         if Master.objects.get(id=self.context.get("master_id")).date_signed > attrs.get("date_start"):
             raise ValidationError(detail="Error Message!")
         # 2. check date start is greater than date end
         if attrs.get("date_start") > attrs.get("date_end"):
             raise ValidationError(detail="Error Message!")
         return attrs

Вместо использования контекста для master_id в данном случае мы используем полезную нагрузку.

class MasterSerializer(serializers.ModelSerializer):
  
     class Meta:
         model = Master
         fields = ['id','date_signed','info1','info2']

class DetailSerializer(serializers.ModelSerializer):
     master = serializers.PrimaryKeyRelatedField(queryset=Master.objects.all())

     class Meta:
         model = Detail
         fields = ['id','master','date_start','date_end','info3','info4'...]

     def to_representation(self, obj):
         data = super().to_representation(obj)
         data.update({"master": MasterSerializer(obj.master).data})
         return data

     def validate(self, attrs):
         # 1. check if date sign is always grater than date start
         if attrs.get("master").date_signed > attrs.get("date_start"):
             raise ValidationError(detail="Error Message!")
         # 2. check date start is greater than date end
         if attrs.get("date_start") > attrs.get("date_end"):
             raise ValidationError(detail="Error Message!")
         return attrs
Вернуться на верх