[英]SQLAlchemy hybrid_property error when setting
我正在嘗試使用hybrid_property裝飾器來定義getter / setter。 這是代碼。
class Users(object):
def __init__(self, username, uid=None, password=None, group_uid=None):
self.uid = uid
self.username = username
self.password = password
self.group_uid = group_uid
def __repr__(self):
return "User(%(username)s)" % self.__dict__
@hybrid_property
def password(self):
return self._password
@password.setter
def set_password(self, password):
self._password = password
在查看用戶對象時,getter可以正常工作,即user.password返回一個字符串,但是調用setter會產生以下結果
user.test('test')
Traceback (most recent call last):
File "--removed--", line 35, in exec_expr
exec code in self.namespace, self.globs
File "<web>", line 1, in <module>
TypeError: 'str' object is not callable
指出我所缺少的任何幫助將不勝感激。
PS。 使用SQLAlchemy 0.9.1版
我對SQLAlchemy代碼的了解還不夠深入,無法確切地說這是問題所在,但我敢打賭,您使用的屬性不正確。 set_password
應該只稱為password
。 我敢打賭,它可以解決您的問題,但是即使不能解決,您仍然需要這樣做。 請參閱此示例。
使用內置的@property
裝飾器,您會看到一個相關的錯誤。 請記住,裝飾器只是分配函數結果的簡寫,該結果采用可調用方法並將其返回到本地名稱空間中裝飾函數的標簽。 您在這里要做的是創建1個可調用的對象,並將其分配給password
,然后創建一個新的可調用的對象,將可調用的password
包裝起來,並將其分配給set_password
。 您在注釋中提到它可在舊版本的SQLAlchemy中使用。 我敢打賭,他們從使用my_var.setter
時修改包裝的可調用對象my_var.setter
為返回新實例。 如果要使用set_password
,則很可能會按您期望的password
工作。
原始模型使用的是經典映射樣式。 重構模型以使用聲明性映射樣式解決了該問題。 我猜混合屬性僅在類使用聲明性基數時起作用。
之所以不起作用,是(我懷疑)是因為您正在像測試方法一樣測試該屬性。 從您的測試代碼中: user.test()
(我假設您在某些版本的代碼中將password
稱為test
。
如果執行user.password('changeme')
則它將無法正常工作,因為user.password不是方法。 相反,它應該是: user.password = 'changeme'
我認為切換到聲明式基准可能只是一個巧合。
我只想把它放在這里給有興趣的人...嘗試在Airflow中創建密碼時,我也遇到了這個問題。 似乎是Airflow中sqlalchemy版本的兼容性問題。 我安裝了它並解決了問題:pip install'sqlalchemy <1.2'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.