Использование таблицы 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'"
, Это не решает проблему, хотя.