4

我有以下两个课程:

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()

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

Tom.address.append(Addr)
print Addr.IsItAssigned 
-> to be True

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

4

1 回答 1

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)

现在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

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

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)提倡使用forlower_case_with_underscores方法和实例属性。

于 2012-12-25T12:22:18.833 回答