我正在尝试在Events表和Contacts表之间创建一个关系,其中一个事件可以有多个联系人,一个可以标记为primary。
我以为我拥有它,但我似乎无法弄清楚如何更改我在关联对象中的主要字段。
这是数据库结构:
import sqlalchemy as sa
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy import orm
import uuid
Base = declarative_base()
Session = orm.sessionmaker()
Engine = sa.create_engine('sqlite:///arandomdb', echo=True)
Session.configure(bind=Engine)
session = Session()
class TblEvents(Base):
__tablename__ = 'tbl_events'
guid = sa.Column(sa.String(36), primary_key=True, nullable=False)
name = sa.Column(sa.String)
contacts = orm.relationship('TblContacts', secondary='tbl_events_contacts', backref='events')
class TblContacts(Base):
__tablename__ = 'tbl_contacts'
guid = sa.Column(sa.String(36), primary_key=True, nullable=False)
name = sa.Column(sa.String)
class TblEventsContacts(Base):
__tablename__ = 'tbl_events_contacts'
event_id = sa.Column(sa.String, sa.ForeignKey(TblEvents.guid), primary_key=True)
contact_id = sa.Column(sa.String, sa.ForeignKey(TblContacts.guid), primary_key=True)
primary = sa.Column(sa.Boolean)
event = orm.relationship('TblEvents',
backref=orm.backref('tbl_events_contacts',
passive_deletes='all'
))
contact = orm.relationship('TblContacts',
backref=orm.backref('tbl_events_contacts',
passive_deletes='all'))
if __name__ == '__main__':
Base.metadata.create_all(Engine)
ev1 = TblEvents(guid=str(uuid.uuid4()), name='event 1')
con1 = TblContacts(guid=str(uuid.uuid4()), name='contact 1')
session.add(ev1, con1)
session.commit()
ev1.contacts.append(con1)
session.commit()
ev1.contacts[0].primary = True
session.commit()
它并没有抱怨尝试设置ev1.contacts [0] .primary = True但它似乎也没有做任何事情。
这种数据结构的正确方法是什么?
答案 0 :(得分:0)
事件对象的contacts属性引用TblContacts对象 - 而不是TblEventsContacts关联对象。
要从TblEvents对象获取对tblEventsContacts对象的引用,您需要使用为该关联定义的反向引用(tbl_events_contacts)。
换句话说,改变:
ev1.contacts[0].primary = True
要:
ev1.tbl_events_contacts[0].primary = True
你应该有更好的运气。