在 sqlalchemy 中绑定关系时分配变量

Ami*_*min 4 python sqlalchemy properties descriptor relationship

我有以下两个类:

class user(Base):
   ....
   id=Column(Integer, primary_key=True)
   address=relationship('Address',backref='user')

class Address(Base):
   ...
   IsItAssgined=False
   user_id=Column(Integer, ForeignKey('user.id'))
Run Code Online (Sandbox Code Playgroud)

让我们创建这些类的两个实例:

Addr=Address()
Tom=User()
Run Code Online (Sandbox Code Playgroud)

我想要以下行为:将 Addr 附加到用户后,地址中的字段 IsItAssigned 将更新为 True,即

Tom.address.append(Addr)
print Addr.IsItAssigned 
-> to be True
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我不知道如何在这里使用描述符。

Mar*_*ers 5

我会为此使用一个属性,一个测试user_id列是否为 NULL的属性。Acolumn_property()在这里似乎很合适:

from sqlalchemy.orm import column_property

class Address(Base):
   ...
   user_id = Column(Integer, ForeignKey('user.id'))
   IsItAssigned = column_property(user_id != None)
Run Code Online (Sandbox Code Playgroud)

现在IsItAssigned将是TrueFalse。或者,使用混合属性

from sqlalchemy.ext.hybrid import hybrid_property

class Address(Base):
   ...
   user_id = Column(Integer, ForeignKey('user.id'))

   @hybrid_property
   def IsItAssigned(self):
       return self.user_id != None
Run Code Online (Sandbox Code Playgroud)

混合属性也具有可在查询中使用的优点。最后但并非最不重要的是,对于这种情况,也许普通属性也可以,但它仅适用于已加载的实例:

class Address(Base):
   ...
   user_id = Column(Integer, ForeignKey('user.id'))

   @property
   def IsItAssigned(self):
       return self.user_id is not None
Run Code Online (Sandbox Code Playgroud)

不过,我会使用不同的名称。assigned可能会更好;在Python的风格指南(PEP 8)主张lower_case_with_underscores的方法和实例属性。