我的问题的简化示例:
我上了这个课:
class PropertySerializer(serializers.ModelSerializer)
class Meta:
model = Properties
fields = (
'key',
'value'
)
我正在序列化到导致ManyToManyField
的模型中的Properties
字段。它只有一个记录。这就是我得到的(正确的是,我故意在其中放置一个null
值):
properties": [
{
"key": "test_property",
"value": null,
}
]
这是准确的,但是我想过滤掉所有null
value
字段。
到目前为止,我尝试的所有操作均失败。仍然将空值序列化。我尝试过:
blank=False
模型的值字段中设置Properties
。value = serializers.CharField(allow_null=False)
添加到PropertySerializer
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])
如果我的序列化器类从此派生,它将删除所有空值。但是,我仍然想知道是否存在每个字段设置真正起作用的情况,而我却在框架中错过了。
答案 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