【问题标题】:change Datetime format django rest framework更改日期时间格式 django rest 框架
【发布时间】:2017-03-31 11:11:18
【问题描述】:

我想在 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": "abc@gmail.com",
      "created_at": "09/26/2016 22:52:16",
 }

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

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

【问题讨论】:

    标签: model django-rest-framework


    【解决方案1】:

    要提供更精细的选项,您可以使用 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>。您可以在documentation找到更多信息。

    【讨论】:

    • 这是最好的方法。
    【解决方案2】:

    您可以在需要不同日期输出的模型序列化程序中覆盖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
        ...
    

    【讨论】:

    • @thumbtackthief 它只是一个用你想要的格式替换的字符串。为了清楚起见,我将其作为评论
    • 格式字符串可以是 format="%Y-%m-%dT%H:%M:%S"
    【解决方案3】:

    这对我有用,在 settings.py 中:

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

    【讨论】:

      【解决方案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 版

      【讨论】:

        猜你喜欢
        • 2016-01-22
        • 1970-01-01
        • 2018-04-23
        • 1970-01-01
        • 2021-02-19
        • 1970-01-01
        • 2016-12-09
        • 2018-05-07
        • 2012-07-19
        相关资源
        最近更新 更多