DRF:获取用于自定义检查的嵌套序列化程序字段

DRF : Getting nestted serializer fields for custom checks

我的模型类

class Master(models.Model):
    date_signed= models.DateField()
    info1 = models.CharField(max_length=255)
    info2 = models.CharField(max_length=255)

class Detail(models.Model):
    date_start = models.DateField()
    date_end = models.DateField()
    info3 = models.CharField(max_length=255)
    info4 = models.CharField(max_length=255)
    master = models.OneToOneField(Master,on_delete=models.CASCADE,related_name='detail')

这是我的主序列化器和详细序列化器。

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

我想做的是检查主序列化器中的 date_signed 是否总是早于 date_start 的日期。为此,我需要详细序列化程序中的 date_signed。那我怎么才能得到它。可能是一个更简单的问题,但我发现这很难,因为我刚开始学习 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 的上下文。如果我们想改变我们的序列化器的表示,那么我们需要覆盖这个 to_representation 函数。

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