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