我有以下两个类:
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'))
让我们为这些类创建两个实例:
Addr=Address()
Tom=User()
我想要以下行为:在追加地址到用户,字段IsItAssigned在地址得到更新为True,即
Tom.address.append(Addr)
print Addr.IsItAssigned
-> to be True
我不知道如何在这里使用描述符
我会使用一个属性,一个测试如果user_id
列不是NULL。column_property()
在这里似乎是合适的:
from sqlalchemy.orm import column_property
class Address(Base):
...
user_id = Column(Integer, ForeignKey('user.id'))
IsItAssigned = column_property(user_id != None)
现在IsItAssigned
将是True
或False
。或者,使用hybrid属性:
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
混合属性的优点是在查询中也可以使用。最后但并非最不重要的是,在这种情况下,也许一个普通的属性也可以做到,但它只会在已经加载的实例上工作:
class Address(Base):
...
user_id = Column(Integer, ForeignKey('user.id'))
@property
def IsItAssigned(self):
return self.user_id is not None
我想用一个不同的名字。assigned
可能更好;Python风格指南(PEP 8)提倡使用lower_case_with_underscores
作为方法和实例属性。