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)
如果可能的话,我不知道如何在这里使用描述符。
我会为此使用一个属性,一个测试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将是True或False。或者,使用混合属性:
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的方法和实例属性。
| 归档时间: |
|
| 查看次数: |
646 次 |
| 最近记录: |