2017-09-06 6 views
0

J'ai une classe de modèle qui ressemble à cePython-Flask-SQLAlchemy Obtenez colonne de date au format ISO

class Test(database.Model): 
     created_date = database.Column(database.DateTime, 
             default=datetime.utcnow, 
             nullable=False) 

Je reçois ce via la commande en cours d'exécution

all = Test.query.all() 

Maintenant, cela me fait dates au format 2017-09-05 09:45:28 Je veux obtenir la représentation ISO des dates comme 2017-09-05T09:45:28.263000.

Une option consiste à post-traiter les données que j'ai reçu, mais quelle est la meilleure approche? Y at-il une construction SQLAlchemy qui va m'aider à atteindre cet objectif?

Répondre

2

Clarifions quelque chose, parce que votre question est peut-être un peu trompeur.

Test.query.all() retourne la liste des objets de test, où chacun est une représentation du modèle que vous avez défini et doit contenir des attributs déclarés (comme creation_date). Maintenant, l'attribut de date de création est un objet datetime et ne vous donne aucune représentation spécifique en soi. Au lieu de cela, il contient certaines méthodes (comme __str__, __repr__, isoformat, etc.) qui vous aide à obtenir la représentation souhaitée de l'objet datetime.

>>> t[0].created_date 
datetime.datetime(2017, 3, 2, 15, 34, 10, 272) 
>>> t[0].created_date.isoformat() 
'2017-03-02T15:34:10.000272' 

La façon dont vous présentez les données qu'il est pas quelque chose que la couche SQLAlchemy doit être au courant, comme SQLAlchemy est ORM (Couche modèle) et par la conception ne devrait pas prévoir dans la couche contrôleur/vue: more on mvc

Si vous voulez vraiment avoir une certaine représentation prédéfinie d'un attribut dans les modèles sqlalchemy, utilisez @property décorateur dans votre classe Test.

@property 
def created_date(self): 
    return self.created_date.isoformat() 

Plus sur cela dans la documentation SQLAlchemy: docs

+0

Vos points sont corrects! Il me manquait en effet la partie que la sérialisation est prise en charge de la bibliothèque "guimauve". J'ai soulevé une autre question pour la personnalisation de la sérialisation https://stackoverflow.com/questions/46074589/python-marshmallow-customize-formatting-of-class-member –