我正在尝试将多对多关系的一对多部分转换为python set()。有关代码,请参阅以下播放示例:
message_tos = Table('message_tos', Base.metadata,
Column('message_id', Integer, ForeignKey('message.id')),
Column('address_id', Integer, ForeignKey('address.id'))
)
class Address(Base):
address = Column(String, nullable=False, unique=True)
emails = relationship('Message')
def __init__(self, address):
self.address = address
class Email(Base):
from = relationship('Address', backref='from')
to = relationship('Address', secondary=message_tos, backref='messages_to')
message_id = Column(String, nullable=False, unique=True)
...
def whatever(*args, **kwargs):
"""
...
"""
email = session.query(Email).filter(Email.message_id==message_id).first()
blah = set(email.to).union(email.from) # This lines throws an error that Address is not iterable
有没有办法运行set(email.to)
代码(将 Address 对象放入一个集合中),还是我完全错误地这样做?显然,我可以只做set([email.to]),但是这是一个完整的额外复杂性顺序(并且这个函数可能会被多次调用,可能很长的.to或.from列表),我宁愿没有
您的错误很可能不是发生在set(email.to)
部分,而是发生在.union(email.from)
中,因为email.from
不是可迭代的。根据您的代码,email.from
是Address
的实例。
不过这应该有效:blah = set(email.to).union([email.from])
.我假设这并没有真正调用属性from
,因为它是python中的保留关键字。我想sender
是个好名字。
另请注意,在 SA 中,使用Query.get
可以更清楚地搜索主键:
email = session.query(Email).get(message_id)