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

我有一个我正在尝试初始化的用户模型,但我不断收到


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 models

import app

with app.app.app_context():

    models.userData(name='admin2', password='test2',  facility_id=1)

我什至在没有 app_context() 的情况下尝试了另一种方式,然后专门从模型中导入 userData。还尝试在每次迭代中交替使用 app_context。



拉风的咖菲猫
浏览 150回答 1
1回答

烙印99

所以才意识到为什么会发生这种行为。基本上,它与 db 范围或任何此类无关。问题是因为在类被实例化的过程中,类的属性变成了可查询的属性,这意味着 sqlalchemy 需要引用这些属性。它是通过__getattr__在创建对象之前使用顺序推断类型(db.Column)来完成的。因为,我覆盖了__getattr__希望使我的输出更容易序列化到 json ,它使用默认返回的值None。这就是导致错误的原因。@propertydef facility(self)->str:    # do stuff to get facility_name    return facility_name
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python