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

时间:2015-07-04 22:07:07

标签: android django gson django-rest-framework

我正在使用Django REST Framework APIViews在我的模型周围实现REST API。其中一个模型如下:

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(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_on上运行GET请求时,以及在创建新对象时,日期updated_onapis/hadithtags的格式会有所不同。 apis/hadithtags上的POST请求并获取新对象。前者返回以下格式:

[{&#34;名称&#34;:&#34;试验&#34;&#34; ADDED_ON&#34;:&#34; 2015-07-04T21:57:25Z&#34;,& #34; updated_on&#34;:&#34; 2015-07-04T21:57:25Z&#34;}]

后者回归:

{&#34;名称&#34;:&#34;试验&#34;&#34; ADDED_ON&#34;:&#34; 2015-07-04T21:57:25.288083Z&#34;,& #34; updated_on&#34;:&#34; 2015-07-04T21:57:25.288118Z&#34;}

如您所见,执行GET会返回没有毫秒的日期时间,而执行POST会返回包含毫秒的日期时间。

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

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

您可以明确定义DateTimeField,并指定所需的日期格式。有关日期格式的说明,请参阅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']