rest Serialzier 改变字段格式

前言

我们用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_timeupdate_time的格式呢?

  1. 自定义一个字段序列化类:

    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')就可以得到指定格式的时间了!!!

  2. 使用自定义的序列化类:

    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')
  3. 浏览器得到的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然后自己想要的值就可以啦!!!

猜你喜欢

转载自blog.csdn.net/q1242027878/article/details/74783799