gpt4 book ai didi

python - Flask_sqlalchemy : why instance created by Model. query.filter_by().first() 不在模型中运行 __init__()

转载 作者:行者123 更新时间:2023-11-30 22:34:35 26 4
gpt4 key购买 nike

我有一个这样的用户模型:

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_by(username=john).first() 返回的,则构造函数无论如何都不会被调用。

而且我已经检查过查询返回的实例是 User 的实例,因此应该在查询完成时调用构造函数。因为根据我的理解,每次创建实例时都会调用构造函数。

问题是:为什么会发生这种情况以及当查询返回用户时如何调用 __init__

最佳答案

我刚刚遇到了同样的问题(构造函数没有被调用),并通读 SQLAlchemy documentation ,这正是它应该表现的方式。当从 Query 对象创建实例时,它不会调用 __init__ 方法。相反,它调用标记为reconstructor(装饰器)的方法。

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

class User(UserMixin, db.Model):

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

来自文档:

Any method may be tagged as the reconstructor(), even the __init__ method. SQLAlchemy will call the reconstructor method with no arguments.

因此,如果您的类具有初始化代码,或者如果您调用 super(),则可以从 __init__ 调用重构器:

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() 将在自定义初始化查询时被调用。

关于python - Flask_sqlalchemy : why instance created by Model. query.filter_by().first() 不在模型中运行 __init__(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44811589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com