更改日期时间格式djangorest框架

问题描述 投票:0回答:5

我想更改 django Rest 框架中的日期时间格式

我已经实现了一种逻辑,但它没有满足我的要求

型号

class User (models.Model):
    user_id = models.AutoField(primary_key=True)
    user_name = models.CharField(max_length=150)
    created_at = models.DateTimeField()

setting.py 文件我定义了日期时间格式

REST_FRAMEWORK = {

    'DATETIME_FORMAT': "%m/%d/%Y %H:%M:%S",
}

查询

data = User.objects.filter(pk=51)
serializer = UserSerializer(data, many=True)

串行器数据后的结果

 {
      "user_id": 41406,
      "user_name": "[email protected]",
      "created_at": "09/26/2016 22:52:16",
 }

现在,当我点击另一个模型时,日期时间格式也与“09/26/2016 22:52:16”相同,但我不希望在 anthor 模型中使用此日期格式。

请告诉我我们是否可以更改特定的模型日期时间格式并在序列化器中调用它

model django-rest-framework
5个回答
30
投票

您可以在需要不同日期输出的模型序列化器中重写

to_representation
方法:

class UserSerializer(serializers.ModelSerializer):
    ...
    def to_representation(self, instance):
        representation = super(UserSerializer, self).to_representation(instance)
        representation['created_at'] = instance.created_at.strftime(<your format string>)
        return representation

或者您可以编写自定义字段并使用它而不是默认字段。

class UserSerializer(serializers.ModelSerializer):
    created_at = serializers.DateTimeField(format='%Y')
    # add read_only=True to the field in case if date created automatically
    ...

4
投票

要提供更细粒度的选项,您可以使用 SerializerMethodField:

class User (models.Model):
    user_id = models.AutoField(primary_key=True)
    user_name = models.CharField(max_length=150)
    created_at = models.SerializerMethodField()
    
    def get_created_at(self, obj):
        return obj.created_at.strftime("%Y-%m-%d %H:%M:%S")

此格式仅适用于该特定序列化器属性。

您可以将其用于任何字段,格式为

get_<field_name>
。您可以在文档中找到更多信息。


4
投票

@dc_Bita98 已经给出了正确的解决方案。

但是对于想要将月份数字转换为月份名称的人,请尝试以下操作:

REST_FRAMEWORK = {
    'DATETIME_FORMAT': '%B %d, %Y', # returns November 8, 2021
    ... 
}

或者月份名称的缩写:

REST_FRAMEWORK = {
    'DATETIME_FORMAT': '%b %d, %Y', # returns Nov 8, 2021
    ... 
}

注意:我使用的是 Django REST Framework 版本 3.12.4

请参阅文档


1
投票

这对我有用,在 settings.py:

REST_FRAMEWORK = {
    'DATE_INPUT_FORMATS': ["%d-%m-%Y", ],
    ...}

0
投票

不知道为什么这还不是答案,但在序列化器中......

date = serializers.DateField(format="%Y-%m-%d")
© www.soinside.com 2019 - 2024. All rights reserved.