Axi*_*xil 6 python django json django-rest-framework
我有一个ImageField类型的模型如下:
class Attendance(models.Model):
face_image = models.ImageField(, blank=True, null=True, storage=MediaStorage())
Run Code Online (Sandbox Code Playgroud)
基于模型的序列化程序
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id','face_image')
Run Code Online (Sandbox Code Playgroud)
但是,如果imagefield为null,则显示如下
Its now showing like this in the json
{
"id": 1,
"face_image": null
}
Run Code Online (Sandbox Code Playgroud)
如果face_image(ImageField)为None,它将显示为null的输出.我想要的是将null替换为像这样的空字符串""
JPG*_*JPG 14
覆盖as 的to_representation()
方法AttendanceSerializer
,
class AttendanceSerializer(serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id', 'face_image')
def to_representation(self, instance):
data = super().to_representation(instance)
if not data['face_image']:
data['face_image'] = ""
return data
Run Code Online (Sandbox Code Playgroud)
您可以使用 SerializerMethodField。
class AttendanceSerializer(serializers.ModelSerializer):
face_image = serializers.SerializerMethodField()
class Meta:
model = Attendance
fields = ('id', 'face_image')
def get_face_image(self, instance):
return (instance.face_image.url if instance.face_image else '')
Run Code Online (Sandbox Code Playgroud)
迭代序列化器元中提到的所有字段的代码:
def to_representation(self, instance):
data = super().to_representation(instance)
for key, value in data.items():
try:
if not value:
data[key] = ""
except KeyError:
pass
return data
Run Code Online (Sandbox Code Playgroud)
为了添加 JPG 的答案,这里有一个 mixin,它允许to_representation
更轻松地重用覆盖该方法的逻辑。它还确保这些值None
不仅仅是falsy。
class ConvertNoneToStringSerializerMixin():
"""
Mixin to convert None to empty strings.
This must be added as the first inherited class. The property `Meta.none_to_str_fields` must
be defined in order for this to have any effect. This only applies to representations,
when we export our instance data, not when we acquire and validate data.
"""
def get_none_to_str_fields(self):
meta = getattr(self, 'Meta', None)
return getattr(meta, 'none_to_str_fields', [])
def to_representation(self, instance):
fields = self.get_none_to_str_fields()
data = super().to_representation(instance)
if not fields or not isinstance(data, dict):
return data
for field in fields:
if field in data and data[field] is None:
data[field] = ''
return data
Run Code Online (Sandbox Code Playgroud)
您将这样使用它:
class AttendanceSerializer(ConvertNoneToStringSerializerMixin, serializers.ModelSerializer):
class Meta:
model = Attendance
fields = ('id', 'face_image')
none_to_str_fields = ('face_image', )
Run Code Online (Sandbox Code Playgroud)
另外,对于那些想知道的人,我们不能重写to_representation
a 本身的方法,因为当值为 时,Field
的核心实现Serializer
将跳过从字段调用。因此,重写序列化器是实现此目的的唯一方法。to_representation
None
归档时间: |
|
查看次数: |
1813 次 |
最近记录: |