Использование таблицы M2M и взаимосвязи для получения конкретных данных в sqlalchemy - PullRequest
2 голосов
/ 19 января 2012

У меня есть таблица

# File : MyRelations.py
ACC_ADD_TABLE = Table('acc_add_rel', METADATA,
    Column('acc_id', ForeignKey('acc.id'),
            nullable=False),
    Column('add_id', ForeignKey('address.id'),
            nullable=False),
    PrimaryKeyConstraint('add_id', 'acc_id'),
    )   

# File : Address.py
class Address(Base):
    id = Column(Integer, primary_key=True,)
    type = Column(String(length=10), nullable=False)

# File : Account.py
class Account(Base):
    id = Column(Integer, primary_key=True,)
    addresses = relationship('Address',
                            secondary=ACC_ADD_TABLE
                            )
#   default_address = relationship('Address',
#                           secondary=ACC_ADD_TABLE,
#                           primaryjoin=and_("ACC_ADD_TABLE.add_id==Address.id",
#                                            "ACC_ADD_TABLE.acc_id==Account.id",
#                                            "Address.type='default'")
#                           )

В соответствии с примером я хочу получить доступ ко всем адресам по умолчанию в учетной записи. Я могу использовать Decla_attr или может написать функцию, но есть ли способ объединить атрибут Table и Class в одной операции and_?

Примечание: Address.py и Account.py оба являются разными файлами, и из-за зависимости от цикла я не могу импортировать любую модель в другую модель

Спасибо за помощь.

1 Ответ

4 голосов
/ 19 января 2012

Работает без импорта:

default_address = relationship('Address',
                       secondary=ACC_ADD_TABLE,
                       primaryjoin="acc.c.id==acc_add_rel.c.acc_id",
                       secondaryjoin="and_(address.c.id==acc_add_rel.c.add_id, address.c.type=='default')",
                       #uselist = True,
                       )

Если вы уверены, что по умолчанию существует только один адрес, вы можете использовать uselist=True для удобства.
Иногда я предпочитаю другую структуру для таких ситуаций: добавьте столбец в таблицу Account: default_address_id и создайте отношение 1-[0..1] на основе этого столбца, все еще проверяя, что ссылка Address также является частью Account.addresses MN отношения.


На заметке: опечатка: в (комментируемом) коде вы должны использовать == вместо = в "Address.type='default'". Это не решает проблему, хотя.

...