Python flask_sqlalchemy:为什么Model.query.filter_by()创建的实例不';在模型中运行

Python flask_sqlalchemy:为什么Model.query.filter_by()创建的实例不';在模型中运行,python,flask-sqlalchemy,Python,Flask Sqlalchemy,我有这样一个用户模型: class User(UserMixin, db.Model): id = db.Column(db.Integer, primary_key = True) username = db.Column(db.String(64), unique=True, index=True # ... def __init__(self, **kwargs): pass 当像这样创建实例:user=user(username='jo

我有这样一个用户模型:

class User(UserMixin, db.Model):
    id = db.Column(db.Integer, primary_key = True)
    username = db.Column(db.String(64), unique=True, index=True
    # ...

    def __init__(self, **kwargs):
        pass
当像这样创建实例:
user=user(username='john')
时,将成功调用构造函数

但是如果实例是由
user=user.query.filter\u by(username=john.first()
返回的,则无论如何都不会调用构造函数

我已经检查了查询返回的实例是否是User的实例,因此在查询完成时应该调用构造函数。因为据我所知,每次创建实例时都会调用构造函数


问题是:为什么会发生这种情况,以及当用户通过查询返回时如何调用
\uuuu init\uuuu

我刚刚遇到了同样的问题(没有调用构造函数),并通读了一遍,这正是它的行为方式。当从
查询
对象创建实例时,它不会调用
\uuuu init\uuu
方法。相反,它调用标记为
重构器
(decorator)的方法

要将方法标记为重构器,请声明一个无参数方法,并使用
SQLAlchemy
实例中的方法对其进行修饰:

class User(UserMixin, db.Model):

    @db.reconstructor
    def reload(self):
        # Will be run when loading from a Query object
从文件中:

任何方法都可以标记为
重构器()
,甚至是
\uuuu init\uuu
方法。SQLAlchemy将不带参数地调用重构器方法

因此,如果您的类有初始化代码,或者您调用了
super()
,那么您可以从
\uuuuu init\uuuu
调用重构器:

class User(UserMixin, db.Model):

    def __init__(self, **kwargs):
        super(User, self).__init__(**kwargs)
        self.reload()

    @db.reconstructor
    def reload(self):
        # Process data from model

这样,在自定义初始化时将调用
reload()
,查询时将调用

Lifesaver。谢谢