2010-06-28 156 views
1

我可以更改datetime.datetime對象的默認__str__()函數嗎? 默認情況下,它返回類似'2010-06-28 12:43:56.985790'的東西,我需要它來打印'2010-06-28T12:44:21.241228'(這是isoformat()函數)。在python中更改默認日期打印格式

我需要這個JSON序列化的Django模型。

我的模式是:


class Transport(models.Model): 
    user = models.ForeignKey(User) 
    source = models.ForeignKey(Marker, related_name="source_marker") 
    destination = models.ForeignKey(Marker, related_name="destination_marker") 
    object = models.CharField(choices=possesion_choices, max_length=2**6) 
    quantity = models.IntegerField() 
    time_sent = models.DateTimeField() 
    time_arrived = models.DateTimeField() 

當我序列化(使用wadofstuff module),它打印像


print serializers.serialize('json', Transport.objects.all(), relations=('source', 'destination',) indent=4) 
[ 
    { 
     "pk": 1, 
     "model": "main.transport", 
     "fields": { 
      [.. bla bla ..] 
      "time_sent": "2010-06-28 12:18:05", 
      "time_arrived": "2010-06-28 12:38:36", 
      [.. bla bla ..] 
     } 
    } 
] 

回答

2

Django使用字段的value_to_string方法來提供內的字符串表示串行器。所以,你可以定義一個自定義字段子類重寫此方法:

class MyDateTimeField(DateTimeField) 
    def value_to_string(self, obj): 
     val = self._get_val_from_obj(obj) 
     if val is None: 
      data = '' 
     else: 
      data = val.isoformat() 
     return data 

編輯

AARGH,貌似我一直在尋找在完全錯誤的地方。 serializers.python.Serializer.handle_field方法實際上檢查日期時間字段,並將它們通過未改變傳遞給JSON編碼器。所以這就是我們實際需要重寫的編碼器。

class MyJSONEncoder(DjangoJSONEncoder): 
    def default(self, o): 
     if isinstance(o, datetime.datetime): 
      return o.isoformat() 
     else: 
      return super(MyJSONEncoder, self).default(o) 

不幸的是,wadofstuff的硬編碼原DjangoJSONEncoder,所以我們需要重寫串行過。

from wadofstuff.django.serializers.json import Serializer 
class BetterSerializer(Serializer): 
    """ 
    Convert a queryset to JSON. 
    """ 
    def end_serialization(self): 
     """Output a JSON encoded queryset.""" 
     self.options.pop('stream', None) 
     self.options.pop('fields', None) 
     self.options.pop('excludes', None) 
     self.options.pop('relations', None) 
     self.options.pop('extras', None) 
     simplejson.dump(self.objects, self.stream, cls=MyJSONEncoder, 
      **self.options) 
+0

花了我一會兒才找到這方面的文檔。它在自定義字段頁面 - http://docs.djangoproject.com/en/1.2/howto/custom-model-fields/#converting-field-data-for-serialization – pycruft 2010-06-28 10:37:52

+0

顯然,這是行不通的。輸出是一樣的。奇怪,因爲文件說它應該這樣做。 – 2010-06-28 11:05:39