Непостоянный столбец SqlAlchemy

Я пытаюсь определить модель с использованием sqlalchemy, так что один из столбцов, которые мне нужны только в памяти для обработки, у меня нет для этого соответствующего столбца базы данных. Мне нужно, чтобы при сохранении объекта в памяти он не пытался сохранить этот специальный столбец.

Дополнительный контекст: я сопоставляю объект json с объектом алхимии sql, используя библиотеку python marshmallow. В ответе json у меня есть дополнительные поля, которые мне не нужны в базе данных, но нуждаются в памяти для вычислений.

Я искал документы sqlalchemy, но не смог найти способ пропустить сохранение определенных столбцов.

class AdSchema(Schema):
  """Schema Mapping class."""

  id = fields.Int(dump_only=True)
  available_formats = fields.List(fields.Str())

  @post_load
  def make_ad(self, data):
    return AdModel(**data)

class AdModel(Base):
  """Ad ORM class."""
  __tablename__ = 'ad_model'

  id = Column(Integer, primary_key=True)

Я что-то упустил здесь?

По сути, я ищу «виртуальный» атрибут, аналогичный тому, что доступен в Rails ORM Как добавить виртуальный атрибут к модели в Ruby on Rails?


person Pratik Khadloya    schedule 28.02.2018    source источник
comment
stackoverflow.com/help/mcve добавьте соответствующие определения модели/таблицы и то, что вы пробовали   -  person Haleemur Ali    schedule 01.03.2018
comment
Разве вы не можете просто использовать простой старый атрибут?   -  person Ilja Everilä    schedule 02.03.2018
comment
Это то, что я пробовал, но когда я определяю метод __init__, sqlalchemy это не нравится.   -  person Pratik Khadloya    schedule 02.03.2018
comment
Не нравится как? В целом SQLAlchemy не заботится о __init__: Mapping не накладывает никаких ограничений или требований на метод конструктора (__init__) для класса.   -  person Ilja Everilä    schedule 04.03.2018


Ответы (1)


Я смог обойти это, выполнив следующие действия:

class MyModel(Base):
    __tablename__ = 'my_model'

    id = Column(Integer, primary_key=True)

    def __init__(self, **kwargs):
        self.non_persisted_column = kwargs['non_persisted_column']
        kwargs.pop('non_peristed_column')
        super().__init__(kwargs)

По сути, атрибут класса non_persisted_column добавляется к классу в методе __init__. Затем non_persisted_column удаляется из kwargs до того, как kwargs будет передано в метод __init__ суперкласса Base SQLAlchemy, поэтому SQLAlchemy не вызовет ошибку и не сохранит non_persisted_column в базе данных.

person jones-chris    schedule 07.02.2020