Django Rest Framework-无法避免在响应中对空字段进行序列化

时间:2019-11-27 20:00:29

标签: django django-rest-framework

我的问题的简化示例:

我上了这个课:

class PropertySerializer(serializers.ModelSerializer)
     class Meta:
            model = Properties

            fields = (
                'key',
                'value'
            )

我正在序列化到导致ManyToManyField的模型中的Properties字段。它只有一个记录。这就是我得到的(正确的是,我故意在其中放置一个null值):

properties": [
      {
        "key": "test_property",
        "value": null,
      }
    ]

这是准确的,但是我想过滤掉所有null value字段。

到目前为止,我尝试的所有操作均失败。仍然将空值序列化。我尝试过:

  1. blank=False模型的值字段中设置Properties
  2. value = serializers.CharField(allow_null=False)添加到PropertySerializer
  3. extra_kwargs = {'value': {'allow_null': False}}添加到PropertySerializer

然后我发现了这一点

class NoNullModelSerializer(serializers.ModelSerializer):

    def to_representation(self, instance):
        result = super(serializers.ModelSerializer, self).to_representation(instance)
        return OrderedDict([(key, result[key]) for key in result if result[key] is not None])

如果我的序列化器类从此派生,它将删除所有空值。但是,我仍然想知道是否存在每个字段设置真正起作用的情况,而我却在框架中错过了。

1 个答案:

答案 0 :(得分:1)

DRF core arguments用于在deserialization处理期间验证输入数据。在您的情况下,DRF序列化器来自模型实例/ QuerySet中的serializing the data。在序列化期间,由于coz,DRF不会验证数据,它认为这些数据已被验证。


解决方法

class PropertySerializer(serializers.ModelSerializer)
    fields_to_be_removed = ['value']

    class Meta:
        model = Properties

        fields = ('key', 'value')

    def to_representation(self, instance):
        rep = super().to_representation(instance)
        for field in self.fields_to_be_removed:
            try:
                if rep[field] is None:  # checks if value is 'None', this is different from "emptiness"
                    rep.pop(field)
            except KeyError:
                pass
        return rep