Tenter de traiter un objet ligne dans SQLAlchemy de la même manière qu'un type de dictionnaire ne fonctionne pas car les types sont différents. Il existe plusieurs modèles, mais je présenterai deux méthodes.
Il est plus facile de comprendre s'il existe un exemple concret, je vais donc l'expliquer en me basant sur la classe Todo ci-dessous à titre d'exemple.
class Todo(db.Model):
__tablename__ = 'todos'
id = db.Column( db.Integer, primary_key=True )
description = db.Column( db.String(), nullable=False )
completed = db.Column( db.Boolean, nullable=False, default=False )
def __repr__(self):
return f'<Todo {self.id} {self.description}>'
__dict__
)Vous pouvez obtenir des valeurs de type dictionnaire en accédant à la propriété __dict__
.
Cependant, veuillez noter que cette méthode obtient également la propriété _sa_instance_state
.
todo = Todo.query.first()
print( todo.__dict__ )
# {'_sa_instance_state': <sqlalchemy.orm.state.InstanceState object at 0x10f4559e8>, 'completed': False, 'id': 17, 'description': 'TASK1'}
Vous pouvez également obtenir des valeurs de type dictionnaire en préparant une fonction qui renvoie des valeurs de type dictionnaire côté classe.
todo = Todo.query.first()
print( todo.toDict() )
# {'id': 17, 'description': 'TASK1', 'completed': False}
class Todo(db.Model):
__tablename__ = 'todos'
id = db.Column( db.Integer, primary_key=True )
description = db.Column( db.String(), nullable=False )
completed = db.Column( db.Boolean, nullable=False, default=False )
list_id = db.Column( db.Integer, db.ForeignKey('todolists.id'), nullable=False )
def __repr__(self):
return f'<Todo {self.id} {self.description}>'
def toDict(self):
return {
'id': self.id,
'description': self.description,
'completed': self.completed
}
** 1. Erreur lors de la tentative d'ajout d'une propriété à un objet de ligne **
todo = Todo.query.first()
todo['label'] = 'Important'
# TypeError: 'Todo' object does not support item assignment
** 2. Erreur lors de la tentative de conversion de type à l'aide de la fonction dict () **
todo = Todo.query.first()
dict(todo)
# TypeError: 'Todo' object is not iterable
Recommended Posts