Как преобразовать строку в кодированном json mutabledict в объект datetime в SLAlchemy - PullRequest
0 голосов
/ 18 июня 2020

Для модели ячейки, определенной:

class Cell(db.Model):
    """ model for Base Cells """

    id = db.Column(db.Integer, primary_key=True,
                   autoincrement=True, index=True)

    row_id = db.Column(
        db.Integer,
        db.ForeignKey("base_row.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )
    row_ref = db.relationship(
        "BaseRow", backref=db.backref("cell_row", cascade="all"))

    column_id = db.Column(
        db.Integer,
        db.ForeignKey("base_column.id", ondelete="CASCADE"),
        nullable=False,
        index=True,
    )
    column_ref = db.relationship(
        "BaseColumn", backref=db.backref("cell_column", cascade="all")
    )

    value = db.Column(MutableDict.as_mutable(JSONB))

, значение представляет собой json изменяемый кодированный dict:

class JsonEncodedDict(db.TypeDecorator):
    """Enables JSON storage by encoding and decoding on the fly."""

    impl = db.Text

    def process_bind_param(self, value, dialect):
        if value is None:
            return "{}"
        else:
            return json.dumps(value)

    def process_result_value(self, value, dialect):
        if value is None:
            return {}
        else:
            return json.loads(value)


mutable.MutableDict.associate_with(JsonEncodedDict)

Поле value в ключе хранилищ модели пары значений в следующем формате:

{'KEY': value}
for date:
{'DATE': date in a '%d-%m-%Y , %H-%M-%S' format}

Я попытался ввести @hybrid_property следующим образом:

@hybrid_property
    def datetime(self):
        if self.value['DATE'] is not None:
            date_string = str(self.value['DATE'])
            return date_string
        else:
            return None

    @datetime.expression
    def datetime(cls):
        if cls.value['DATE'] is not None:
            date_string = str(cls.value['DATE'])
            return func.Date(date_string)
        else:
            return None

это вызывает ошибку:

DataError: (psycopg2.errors.InvalidDatetimeFormat) invalid input syntax for type date: "cell.value[:value_1]"
LINE 3: WHERE Date('cell.value[:value_1]') > '2020-06-18T23:17:12.45...

Как для получения даты и времени в значениях, если значение содержит поле DATE?

...