Poblando una relación SQLAlchemy de muchos a muchos usando ID en lugar de objetos

La situación:

Por lo tanto, tengo una relación básica de muchos a muchos en SQLAlchemy utilizando una tabla de asociación .
Por ejemplo, una persona puede asistir a muchas fiestas y una fiesta puede tener muchas personas como invitados:

class Person(Base): __tablename__ = 'person' id = Column(Integer, primary_key=True) name = db.Column(db.String(50)) class SexyParty(Base): __tablename__ = 'sexy_party' id = Column(Integer, primary_key=True) guests = relationship('Person', secondary='guest_association', lazy='dynamic', backref='parties') guest_association = Table( 'guest_association', Column('user_id', Integer(), ForeignKey('person.id')), Column('sexyparty.id', Integer(), ForeignKey('sexyparty.id')) ) 

Normalmente, si quisiera agregar una lista de invitados a una fiesta, haría algo como esto:

 my_guests = [prince, olivia, brittany, me] my_party.guests = guests db.session.commit() 

… donde prince, olivia y brittany son todas las instancias de , y my_party es una instancia de .

Mi pregunta

Me gustaría agregar invitados a una fiesta usando la identificación de la persona en lugar de instancias. Por ejemplo:

 guest_ids = [1, 2, 3, 5] my_party.guests = guest_ids # <-- This fails, because guest_ids # are not  instances 

Siempre podría cargar las instancias desde las bases de datos, pero eso implicaría una consulta de base de datos innecesaria solo para establecer una relación simple de muchos a muchos.

¿Cómo hago para configurar el atributo .guests utilizando una lista de person_id’s? Tiene que haber una forma simple de hacer esto, ya que la tabla de asociación en última instancia representa la relación de muchos a muchos utilizando ID de todos modos …

Gracias de antemano, espero que la pregunta sea clara.

 from sqlalchemy import * from sqlalchemy.orm import * from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class Person(Base): __tablename__ = 'person' id = Column(Integer, primary_key=True) name = Column(String(50)) class SexyParty(Base): __tablename__ = 'sexy_party' id = Column(Integer, primary_key=True) guests = relationship('Person', secondary='guest_association', lazy='dynamic', backref='parties') guest_association = Table( 'guest_association', Base.metadata, Column('user_id', Integer(), ForeignKey('person.id'), primary_key=True), Column('sexyparty_id', Integer(), ForeignKey('sexy_party.id'), primary_key=True) ) e = create_engine("sqlite://", echo=True) Base.metadata.create_all(e) sess = Session(e) p1 = Person(id=1, name='p1') p2 = Person(id=2, name='p2') p3 = Person(id=3, name='p3') p4 = Person(id=4, name='p4') sp1 = SexyParty(id=1) sess.add_all([sp1, p1, p2, p3, p4]) sess.commit() # method one. use insert() sess.execute(guest_association.insert().values([(1, 1), (2, 1)])) # method two. map, optional association proxy from sqlalchemy.ext.associationproxy import association_proxy class GuestAssociation(Base): __table__ = guest_association party = relationship("SexyParty", backref="association_recs") SexyParty.association_ids = association_proxy( "association_recs", "user_id", creator=lambda uid: GuestAssociation(user_id=uid)) sp1.association_ids.extend([3, 4]) sess.commit()