2010-06-28 7 views
1

Puis-je modifier la fonction __str__() par défaut de l'objet datetime.datetime? Par défaut, il retourne quelque chose comme '2010-06-28 12:43:56.985790', et j'en ai besoin pour imprimer quelque chose comme '2010-06-28T12:44:21.241228' (qui est la fonction isoformat()).Modification du format d'impression de date par défaut en python

J'ai besoin de cela pour la sérialisation JSON d'un modèle django.

Mon modèle est:


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() 

Et quand je sérialiser (en utilisant le wadofstuff module), elle imprime quelque chose comme


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 ..] 
     } 
    } 
] 

Répondre

2

Django utilise value_to_string méthode d'un champ pour fournir la représentation de chaîne dans un sérialiseur. Donc, vous pouvez définir une sous-classe de champ personnalisé qui remplace cette méthode:

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 

Edité

Aargh, on dirait que je cherchais dans complètement au mauvais endroit. La méthode serializers.python.Serializer.handle_field vérifie réellement les champs date-heure et les transmet sans changement à l'encodeur JSON. C'est donc cet encodeur que nous devons réellement remplacer.

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

Malheureusement, wadofstuff la DjangoJSONEncoder originale hardcodes, donc nous aurons besoin de passer outre le sérialiseur aussi.

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

Il m'a fallu un moment pour trouver la documentation pour cela. C'est ici dans la page des champs personnalisés - http://docs.djangoproject.com/fr/1.2/howto/custom-model-fields/#converting-field-data-for-serialization – pycruft

+0

Apparemment, cela ne fonctionne pas. La sortie est la même. Étrange, puisque la documentation dit que cela devrait être fait comme ça. –

Questions connexes