我使用以下模型存储数据。
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
timestamp=db.Column(DateTime(timezone=True), nullable=False)
def __init__(self, username, timestamp=None):
self.username = username
if timestamp is None:
timestamp =datetime.datetime.now()
self.timestamp = timestamp
def __repr__(self):
return '<User %r>' % self.username
现在,我的问题是:使用
获取数据时user = User.query.filter_by(username='admin').first()
我了解数据将被提取并转换为User
对象?
总而言之,我想要完成的是,在使用上述查询获取数据时,数据会自动处理。
也就是说,在我的情况下,时间戳已被识别。我将使用pytz.localize()来做到这一点。
我试过了:
class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(80), unique=True)
timestamp=db.Column(DateTime(timezone=True), nullable=False)
def __init__(self, username, timestamp=None):
self.username = username
if timestamp is None:
timestamp =datetime.datetime.now()
timestamp = pytz.utc.localize(timestamp)
self.timestamp = timestamp
def __repr__(self):
return '<User %r>' % self.username
当我初始化对象时,我认为它是
if(timestamp is none)
new entry
initialize timestamp
make timezone aware #even if fetched from db
self.timestamp=timestamp`
但是,它不起作用。查询数据时不会调用__init__
。可以做些什么?
答案 0 :(得分:2)
我在sqlalchemy文档中发现,当从一行重新创建对象时,它不使用__init __()。
请参阅:http://docs.sqlalchemy.org/en/latest/orm/constructors.html
在重新创建对象时,SQLAlchemy ORM不会调用__init__ 数据库行。 ORM的过程有点类似于Python 标准库的pickle模块,调用低级__new__ 方法,然后直接在实例上静默恢复属性 而不是调用__init __。
如果您之前需要在数据库加载的实例上进行一些设置 他们准备好使用,你可以使用@reconstructor装饰器来标记 作为__init__的ORM对应方法。 SQLAlchemy会调用它 每次加载或重建其中一个时都没有参数的方法 你的实例。这对于重建瞬态属性很有用 通常在__init __:
中分配
from sqlalchemy import orm
class MyMappedClass(object):
def __init__(self, data):
self.data = data
# we need stuff on all instances, but not in the database.
self.stuff = []
@orm.reconstructor
def init_on_load(self):
self.stuff = []