SQLAlchemy - проблема MappedCollection - PullRequest
3 голосов
/ 27 апреля 2009

У меня есть некоторые проблемы с настройкой коллекции словарей в SQLAlchemy Python:

Я использую декларативное определение таблиц. У меня есть Item таблица в отношении 1: N с Record таблицей. Я установил отношение, используя следующий код:

_Base = declarative_base()

class Record(_Base):
    __tablename__ = 'records'

    item_id = Column(String(M_ITEM_ID), ForeignKey('items.id'))
    id = Column(String(M_RECORD_ID), primary_key=True)
    uri = Column(String(M_RECORD_URI))
    name = Column(String(M_RECORD_NAME))

class Item(_Base):
    __tablename__ = 'items'

    id = Column(String(M_ITEM_ID), primary_key=True)

    records = relation(Record, collection_class=column_mapped_collection(Record.name), backref='item')

Теперь я хочу работать с Item s и Record s. Давайте создадим несколько объектов:

i1 = Item(id='id1')
r = Record(id='mujrecord')

А теперь я хочу связать эти объекты, используя следующий код:

i1.records['source_wav'] = r

, но Record r не имеет атрибута name (внешний ключ). Есть ли решение, как автоматически это обеспечить? (Я знаю, что установка внешнего ключа во время создания Record работает, но это не очень хорошо для меня).

Большое спасибо

Ответы [ 3 ]

2 голосов
/ 19 мая 2009

Вы хотите что-то вроде этого:

from sqlalchemy.orm import validates

class Item(_Base):
    [...]

    @validates('records')
    def validate_record(self, key, record):
      assert record.name is not None, "Record fails validation, must have a name"
      return record

С этим вы получите желаемое подтверждение:

>>> i1 = Item(id='id1')
>>> r = Record(id='mujrecord')
>>> i1.records['source_wav'] = r
Traceback (most recent call last):
  [...]
AssertionError: Record fails validation, must have a name
>>> r.name = 'foo'
>>> i1.records['source_wav'] = r
>>> 
1 голос
/ 21 мая 2009

Я пока не могу комментировать, поэтому я просто напишу это как отдельный ответ:

from sqlalchemy.orm import validates

class Item(_Base):
    [...]

    @validates('records')
    def validate_record(self, key, record):
      record.name=key
      return record

Это в основном копия ответа Гуннлаугура, но он злоупотребляет декоратором validates, чтобы сделать что-то более полезное, чем взрыв.

0 голосов
/ 08 мая 2009

У вас есть:

backref='item'

Это опечатка для

backref='name'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...