【问题标题】:How to pass flag to child serializer in DRF如何将标志传递给 DRF 中的子序列化程序
【发布时间】:2018-06-18 07:35:16
【问题描述】:

我有一个嵌套的序列化程序,我想将父序列化程序数据传递给孩子。但我不明白我该怎么做。我想做这样的事情:

class BookingSerializer(serializers.ModelSerializer):
    use_additional_fields = serializers.BooleanField()
    persons = PersonSerializer(many=True)



class PersonSerializer(serializers.ModelSerializer):

    def validate_date_of_birth(self, value):
       if parent.use_additional_fields and not value:
          raise serializers.ValidationError(_('Date of birth is required'))
       return value

    class Meta:
        model = Person
        exclude = ('phone', 'date_of_birth')

所以如果用户在父序列化程序中选择use_additional_fields,那么我在子序列化程序中的一些字段应该是必需的

【问题讨论】:

  • 您可以覆盖 BookingSerializer 中的验证,并从那里调用 PersonSerializer 的验证函数。

标签: django django-rest-framework serialization


【解决方案1】:

您可以直接从请求对象中获取数据:

class PersonSerializer(serializers.ModelSerializer):

    def validate_date_of_birth(self, value):
       if self.context['request'].data.get('use_additional_fields') and not value:
          raise serializers.ValidationError(_('Date of birth is required'))
       return value

    class Meta:
        model = Person
        exclude = ('phone', 'date_of_birth')

请注意,如果您在视图中手动启动序列化程序实例,则应将请求传递给序列化程序的context

serializer = BookingSerializer(data=data, context={'request': request})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-06-20
    • 2023-02-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-03
    • 2019-07-25
    • 2021-04-03
    相关资源
    最近更新 更多