【问题标题】:assigning a variable upon binding a relationship in sqlalchemy在 sqlalchemy 中绑定关系时分配变量
【发布时间】:2012-12-11 09:31:10
【问题描述】:

我有以下两个类:

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

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

【问题讨论】:

    标签: python properties sqlalchemy relationship descriptor


    【解决方案1】:

    我会使用一个属性来测试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 property:

    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 style guide (PEP 8) 提倡 lower_case_with_underscores 用于方法和实例属性。

    【讨论】:

    • 嗨 Martijn,感谢您的回复,我想我的描述中遗漏了一些内容。尽管地址仍分配给用户,但我可能想稍后将“IsItAssigned”设置为 False!一般来说,我想在追加发生时对属性做一些事情(调用那个方法或者......),稍后我可能会改变它!
    • @Amin:在这种情况下,您需要改用events;什么时候应该设置IsItAssigned?插入地址,user_id 设置为非 NULL 值,还是其他?
    • Martijn,我在看事件。感谢分享。它应该在设置 user_id 时第一次设置,但后来我希望能够像 Addr.IsItAssigned=False 一样更改它
    • @Amin:注意如果你使用事件,信息不会被持久化在数据库中。在这种情况下,该属性将重置。在这种情况下,您应该将其设为一列。
    • @Amin:当然,您可以在加载实例时使用更多事件来设置属性,但根据我的经验,这种方式会变得非常复杂。
    猜你喜欢
    • 2013-05-22
    • 1970-01-01
    • 2020-05-26
    • 2011-12-12
    • 1970-01-01
    • 2015-04-29
    • 2019-01-18
    • 2021-07-27
    • 2018-10-04
    相关资源
    最近更新 更多