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。谢谢