Python SqlAlchemy从父对象更改关联对象中字段的值

Python SqlAlchemy从父对象更改关联对象中字段的值,python,sqlalchemy,Python,Sqlalchemy,我试图在事件表和联系人表之间创建一个关系,其中一个事件可以有多个联系人,一个可以标记为主要联系人 我以为我有它,但我似乎不知道如何更改关联对象中的主字段 以下是数据库结构: import sqlalchemy as sa from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.ext.associationproxy import association_proxy from sqlalchemy impor

我试图在事件表和联系人表之间创建一个关系,其中一个事件可以有多个联系人,一个可以标记为主要联系人

我以为我有它,但我似乎不知道如何更改关联对象中的主字段

以下是数据库结构:

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,但它似乎也没有做任何事情


处理此数据结构的正确方法是什么?

事件对象的contacts属性引用TblContacts对象,而不是TblEventsContacts关联对象

要从TblEvents对象获取对tblEventsContacts对象的引用,需要使用为该关联定义的反向引用(tbl\U事件\U联系人)

换言之,改变:

ev1.contacts[0].primary = True
致:


而且你应该有更好的运气。

哦,对了,这很有道理。我回家后会试试的。
ev1.tbl_events_contacts[0].primary = True