Использование таблицы M2M и взаимосвязи для получения конкретных данных в sqlalchemy

У меня есть стол

# 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 ответ

Решение

Это работает без необходимости импорта:

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'", Это не решает проблему, хотя.

Другие вопросы по тегам