我有一个要初始化的用户模型,而且我一直在获取
AttributeError:'NoneType'对象没有属性'set'
进一步检查后,我了解到sqlalchemy将其模型转换为包含属性InstrumentedAttribute的映射器,从而使它们可查询。显然,所有这些操作都在对象初始化时发生。
这仅在用户模型中发生,而其他情况则没有。
我尝试使用app_context来查看是否是由于数据库不在范围内。但这没有帮助。
class userData(db.Model):
__tablename__ = "users"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(128), nullable=False)
# TODO need to add hashing for the password
password = db.Column(db.String(10), nullable=False)
type = db.Column(db.String(5), nullable=False)
facility_id = db.Column(db.Integer, db.ForeignKey('facility.id'), nullable=True)
auth_hash = db.Column(db.String, nullable=True)
def __init__(self, *args, **kwargs) -> None:
super(userData, self).__init__(*args, **kwargs)
def __getattr__(self, item):
if item is 'facility':
facility = facilityData.query.filter(facilityData.id == self.facility_id).first()
if facility is None:
return "No Facility Found"
else:
return facility.facility_name
作为参考,这一功能很好:
class barcodeData(db.Model):
__tablename__ = 'barcodes'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
barcode = db.Column(db.String(128), nullable=False)
medid = db.Column(db.String(128), nullable=False)
user = db.Column(db.Integer, db.ForeignKey('users.id'), nullable=True)
def __init__(self, data):
'''class constructor'''
self.barcode = data.get('barcode')
self.medid = data.get('medid')
self.user = data.get('user')
这是我尝试创建新的userData对象时遇到的错误。
import models
import app
with app.app.app_context():
models.userData(name='admin2', password='test2', facility_id=1)
我什至尝试了不使用app_context()的另一种方法,然后专门从模型导入userData。还尝试在每次迭代中交替使用app_context。
attributes.py in __set__(self, instance, value)
258
259 def __set__(self, instance, value):
--> 260 self.impl.set(
261 instance_state(instance), instance_dict(instance), value, None
262 )
AttributeError: 'NoneType' object has no attribute 'set'
答案 0 :(得分:2)
所以才意识到为什么会发生这种行为。基本上,它与数据库范围或任何此类无关。
问题是因为在实例化该类的过程中,该类的属性变成了可查询的属性,这意味着sqlalchemy需要引用所述属性。在创建对象之前,通过使用__getattr__
顺序推断类型(db.Column)来完成此操作。
因为,我改写了__getattr__
,希望对我的输出而言,序列化到json更容易,它使用的是默认返回的值 None 。这就是导致错误的原因。
@property
def facility(self)->str:
# do stuff to get facility_name
return facility_name