1

我正在尝试将多对多关系的一对多部分转换为 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)代码(将地址对象放入集合中),还是我完全错误的方式?显然,我可以只做 set([email.to]),但这是一个额外的复杂顺序(并且这个函数可能会被多次调用,可能长的 .to 或 .from 列表),我宁愿不这样做有

4

1 回答 1

2

您的错误很可能不是发生在set(email.to)part 中,而是发生在 中.union(email.from),因为email.from是不可迭代的。根据您的代码,email.fromAddress.

这应该可以工作:blah = set(email.to).union([email.from]). 我假设这并没有真正调用 property from,因为它是 python 中的保留关键字。我想sender是个好名字。


另请注意,在 SA 中搜索主键可以通过以下方式更清楚地完成Query.get

email = session.query(Email).get(message_id)
于 2012-07-06T13:49:26.383 回答