为了账号安全,请及时绑定邮箱和手机立即绑定

sqlalchemy 模型初始化将模型属性变形为无类型

sqlalchemy 模型初始化将模型属性变形为无类型

拉风的咖菲猫 2021-10-26 18:33:54
我有一个我正在尝试初始化的用户模型,但我不断收到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


查看完整回答
反对 回复 2021-10-26
  • 1 回答
  • 0 关注
  • 146 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信