es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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)
Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema aquí es que self.tag_str es un objeto InstrumentedAttribute 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 de self.tag_str utilizando la función getattr(). Intente modificar el método environ() de la siguiente manera:

    @hybrid_property
    def environ(self):
        if self.tag_str:
            val = json.loads(getattr(self, 'tag_str'))
            return val
        return None
    

    Al utilizar getattr(self, 'tag_str'), podemos obtener el valor original del atributo tag_str sin utilizar la capa ORM. Este valor luego se puede pasar a json.loads() para obtener una cadena compatible con JSON.

Comments are closed.