Flask-SQLAlchemy:在获取时操纵数据的属性

时间:2016-12-23 08:43:42

标签: python python-2.7 flask sqlalchemy flask-sqlalchemy

我使用以下模型存储数据。

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__。可以做些什么?

1 个答案:

答案 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 = []