如何在Django序列化器中将DateTimeField仅显示日期而非时间?
解决办法:
我来给你几个实用的方案,帮你把DateTimeField只输出日期部分:
方案1:使用SerializerMethodField自定义输出
这种方式最直观,每个日期字段单独处理,还能灵活应对null的情况:
class Serializer_Job_TX(serializers.ModelSerializer): created_at = serializers.SerializerMethodField() updated_at = serializers.SerializerMethodField() def get_created_at(self, obj): # 如果字段不为空,返回日期部分;否则返回None return obj.created_at.date() if obj.created_at else None def get_updated_at(self, obj): return obj.updated_at.date() if obj.updated_at else None class Meta: model = modelTest fields = [ 'created_at', 'updated_at', 'imageA', ]
方案2:自定义日期字段类(复用性强)
如果你的多个序列化器都需要只输出日期的功能,可以自定义一个通用字段:
from rest_framework import serializers class DateOnlyField(serializers.DateTimeField): def to_representation(self, value): if not value: return None # 只返回日期对象,序列化后会自动转为字符串格式 return value.date() # 然后在序列化器中使用这个字段 class Serializer_Job_TX(serializers.ModelSerializer): created_at = DateOnlyField() updated_at = DateOnlyField() class Meta: model = modelTest fields = [ 'created_at', 'updated_at', 'imageA', ]
方案3:重写序列化器的to_representation方法统一处理
如果想在序列化器层面统一修改所有日期字段的输出,可以重写这个方法:
class Serializer_Job_TX(serializers.ModelSerializer): class Meta: model = modelTest fields = [ 'created_at', 'updated_at', 'imageA', ] def to_representation(self, instance): # 先获取默认的序列化数据 data = super().to_representation(instance) # 逐个处理日期字段 if data.get('created_at'): data['created_at'] = instance.created_at.date() if data.get('updated_at'): data['updated_at'] = instance.updated_at.date() return data
这三个方案都能实现你的需求,你可以根据自己的实际场景选择:如果只是单个序列化器需要,方案1或3都可以;如果多个地方需要,方案2的复用性更好。
内容的提问来源于stack exchange,提问作者MistyD
相关产品推荐
相关产品推荐

