Obtuve el tipo de valor ‘sqlalchemy.orm.attributes.InstrumentedAttribute’.
Estoy usando sqlalchemy en mi aplicación Flask y funciona en Python 3.7. Básicamente, solo quiero obtener el valor de self.tag_str
y asumir que el valor de esta variable sería una cadena (str
), pero en su lugar obtengo el valor del tipo <class 'sqlalchemy.orm.attributes.InstrumentedAttribute'>
, que no es válido para convertirlo en JSON ya que json.loads
solo acepta valores de cadena. ¿Hay alguna forma de obtener el valor original?
class TestModel(InternalJsonSerializer, CommonIntegraColumns):
__tablename__ = 'test_table_name'
__type__ = 'test_type'
id = Column('test1', BigInteger, primary_key=True, autoincrement=True)
col1 = Column('test2', String(2), nullable=False)
col2 = Column('test3', String(100), nullable=False)
col3 = Column('test4', String(100), nullable=False)
tag_str = Column('test5', Text, nullable=True)
@hybrid_property
def environ(self):
# @tag_str InstrumentedAttribute
if self.tag_str:
val = json.loads(str(self.tag_str))
return val
return None
@environ.setter
def set_environ(self, value):
if value is None:
self.tag_str = None
else:
self.tag_str = json.dumps(value)
davy.ai
El problema aquí es que
self.tag_str
es un objetoInstrumentedAttribute
de SQLAlchemy ORM, en lugar de ser una cadena de texto como se esperaba. Una forma de obtener el valor original sería acceder al atributo subyacente deself.tag_str
utilizando la funcióngetattr()
. Intente modificar el métodoenviron()
de la siguiente manera:Al utilizar
getattr(self, 'tag_str')
, podemos obtener el valor original del atributotag_str
sin utilizar la capa ORM. Este valor luego se puede pasar ajson.loads()
para obtener una cadena compatible con JSON.