generics.RetrieveUpdateDestroyAPIView 和 generics.ListCreateAPIView 日期格式不同

generics.RetrieveUpdateDestroyAPIView and generics.ListCreateAPIView format dates differently

我正在使用 Django REST Framework APIViews 围绕我的模型实施 REST APIs。其中一个模型如下:

class HadithTag(models.Model):
  """A model describing a tag for hadiths."""
  name = models.CharField(max_length=32, primary_key=True)
  added_on = models.DateTimeField(auto_now=False, auto_now_add=True)
  updated_on = models.DateTimeField(auto_now=True, auto_now_add=True)

  def __unicode__(self):
    return self.name

它有以下序列化器:

class HadithTagSerializer(serializers.ModelSerializer):
  class Meta:
    model = HadithTag
    fields = ['name', 'added_on', 'updated_on']

以及以下 URL 模式:

url(r'^apis/hadithtags/$', apiviews.HadithTagSetView.as_view()),
url(r'^apis/hadithtags/(?P<pk>\w+)$', apiviews.HadithTagView.as_view()),

以及以下 API 视图 类:

class HadithTagSetView(generics.ListCreateAPIView):
  queryset = HadithTag.objects.all()
  serializer_class = HadithTagSerializer


class HadithTagView(generics.RetrieveUpdateDestroyAPIView):
  queryset = HadithTag.objects.all()
  serializer_class = HadithTagSerializer

现在我的问题是,由于某种原因,日期 added_onupdated_on 的格式在我 运行 对 apis/hadithtags 的 GET 请求时返回不同我使用 apis/hadithtags 上的 POST 请求创建了一个新对象并获取了新对象。前者returns格式如下:

[{"name":"Test","added_on":"2015-07-04T21:57:25Z","updated_on":"2015-07-04T21: 57:25Z"}]

而后者returns:

{"name":"Test","added_on":"2015-07-04T21:57:25.288083Z","updated_on":"2015-07-04T21: 57:25.288118Z"}

如您所见,执行 GET returns 没有毫秒的日期时间,同时执行 POST returns 包含毫秒的日期时间。

当我尝试使用 Java 的 Gson 库解析日期时间时,这会导致问题。第一个成功,第二个失败。

有什么想法吗?

我认为您看到这个问题是因为 Django 在您执行 post 请求时创建了一个微秒的日期。但是,当您保存到数据库时,微秒会被截断,因此您稍后执行 get 请求时会得到不同的结果。在 Django 1.8 中的 MySQL 中的 DateTime 字段中添加了对微秒的支持。

您可以定义 DateTimeField explicitly, and specify the date format you require. See this page 来解释日期格式。

class HadithTagSerializer(serializers.ModelSerializer):
    added_on = DateTimeField(format='%Y-%m-%dT%H:%M:%SZ')
    updated_on = DateTimeField(format='%Y-%m-%dT%H:%M:%SZ')

    class Meta:
        model = HadithTag
        fields = ['name', 'added_on', 'updated_on']