1

多対多の関係の 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

(Address オブジェクトをセットに配置する) コードを実行する方法はありますかset(email.to)、それとも完全に間違った方法でしょうか? 明らかに、set([email.to]) を実行することもできますが、これは完全に余分な複雑さの順序です (そして、この関数は潜在的に非常に長い .to または .from リストで複数回呼び出される可能性があります)。持ってる

4

1 に答える 1

2

エラーはおそらくset(email.to)部分ではなく、で発生します。これは反復可能.union(email.from)ではないためemail.fromです。あなたのコードによるとemail.from、はのインスタンスですAddress

ただし、これは機能するはずですblah = set(email.to).union([email.from])これはPythonで予約されたキーワードであるため、実際にはプロパティを呼び出さなかったと思います。いい名前fromだと思います。sender


Query.getまた、SAでは、主キーの検索は:を使用してより明確に実行できることに注意してください。

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