前言
我们用Serializer返回Json数据的时候,我们会发现有的字段不是我们想要的效果,
比如一个datetime类型的字段,会默认返回为:
。
"update_time": "2017-07-08T00:41:07.201525Z"
而我们想要的效果是:
"update_time": "2017-07-08 01:15"
那么该如何实现呢?我们一起来看看。
实践
我们先来看看models都有哪些类:
class User(models.Model):
username = models.CharField(max_length=20, null=False, unique=True)
password = models.CharField(max_length=20, null=False)
name = models.CharField(max_length=10, null=False, unique=True) # 名称
class Blog(models.Model):
title = models.CharField(max_length=50, null=False)
body = models.TextField()
owner = models.ForeignKey(User) # 博客的创建者
create_time = models.DateTimeField("创建日期", auto_now_add=True)
update_time = models.DateTimeField("更新日期", auto_now=True)
is_deleted = models.BooleanField(default=False)
def __str__(self):
return self.title
这就是一个简单的博客的数据库模型了~~
那么来看看serializer:
class BlogSerializer(serializers.ModelSerializer):
owner = serializers.ReadOnlyField(source='owner.name')
class Meta:
model = Blog
fields = ('id', 'title', 'body', 'owner','create_time','update_time')
也非常的简单,那么我们应该怎么改变create_time
和update_time
的格式呢?
自定义一个字段序列化类:
class FormatTimeField(serializers.BaseSerializer): def to_representation(self, value): return value.now().strftime('%Y-%m-%d %H:%M')
这里我们是只读的,所以,只需要重写to_representation这个方法,其中的value是传递进来的字段,在这个例子中就是datetime。
然后我们调用
datetime.now().strftime('%Y-%m-%d %H:%M')
就可以得到指定格式的时间了!!!使用自定义的序列化类:
class BlogSerializer(serializers.ModelSerializer): owner = serializers.ReadOnlyField(source='owner.name') create_time = FormatTimeField(read_only=True) update_time = FormatTimeField(read_only=True) class Meta: model = Blog fields = ('id', 'title', 'body', 'owner','create_time','update_time')
浏览器得到的json数据就是如下效果啦:
{ "id": 4, "title": "ICELEE的博客", "body": "哎哟 不错哦", "owner": "李斌2", "create_time": "2017-07-08 01:23", "update_time": "2017-07-08 01:23" }
后记
所以,改变某个字段还是很简单的,我们只需要继承serializers.BaseSerializer
类,然后通过传入的value然后自己想要的值就可以啦!!!