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
我的模型类
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