我有以下SerializerField:
class TimestampField(Field):
def to_representation(self, value):
if not value:
return ''
return value.timestamp()我在我的序列化程序中这样使用它:
class ArticlePhotobookSerializer(ModelSerializer):
delivery_date_from = TimestampField()
delivery_date_to = TimestampField()现在,getter delivery_date_to可以返回None,我希望使用to_representation方法将其转换为空字符串。但是,当我使用序列化程序解析这个None值时,它甚至没有输入to_representation方法并立即返回None。我应该更改什么以同时使用to_representation for None的方法
发布于 2017-09-13 16:15:24
默认情况下,序列化程序的to_representation方法跳过无值字段(参见来源)。
您可以编写混合类来覆盖默认的to_representation。
class ToReprMixin(object):
def to_representation(self, instance):
ret = OrderedDict()
fields = [field for field in self.fields.values() if not field.write_only]
for field in fields:
try:
attribute = field.get_attribute(instance)
except SkipField:
continue
ret[field.field_name] = field.to_representation(attribute)
return ret并在序列化程序中使用:
class ArticlePhotobookSerializer(ToReprMixin, ModelSerializer):
...发布于 2022-10-24 10:40:27
如果您想在没有实例(与您的问题不完全相同,但匹配问题标题)时更改to_representation的结果,那么to_representation甚至不会在DRF v3中被调用。可以通过子类get_initial方法来更改结果:
def get_initial(self):
"""
Return a value to use when the field is being returned as a primitive
value, without any object instance.
"""
if callable(self.initial):
return self.initial()
return self.initial以下是一个例子:
def get_initial(self) -> dict:
return {'display_name': 'moocows'}在这里,我们使用上下文作为初始表示:
def get_initial(self) -> dict:
return self.contexthttps://stackoverflow.com/questions/46201067
复制相似问题