我有一个我正在尝试初始化的用户模型,但我不断收到AttributeError: 'NoneType' 对象没有属性 'set'经过进一步检查,我了解到 sqlalchemy 将其模型转换为包含 InstrumentedAttribute 属性的映射器,使它们可查询。显然这一切都发生在对象初始化时。这只发生在用户模型上,没有别的。我尝试使用 app_context 来查看是否是由于 db 不在范围内。但它没有帮助。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 modelsimport appwith app.app.app_context(): models.userData(name='admin2', password='test2', facility_id=1)我什至在没有 app_context() 的情况下尝试了另一种方式,然后专门从模型中导入 userData。还尝试在每次迭代中交替使用 app_context。
1 回答
烙印99
TA贡献1829条经验 获得超13个赞
所以才意识到为什么会发生这种行为。基本上,它与 db 范围或任何此类无关。
问题是因为在类被实例化的过程中,类的属性变成了可查询的属性,这意味着 sqlalchemy 需要引用这些属性。它是通过__getattr__在创建对象之前使用顺序推断类型(db.Column)来完成的。
因为,我覆盖了__getattr__希望使我的输出更容易序列化到 json ,它使用默认返回的值None。这就是导致错误的原因。
@property
def facility(self)->str:
# do stuff to get facility_name
return facility_name
添加回答
举报
0/150
提交
取消