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



我有以下两个类:

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将是TrueFalse。或者,使用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作为方法和实例属性。

相关内容

  • 没有找到相关文章

最新更新