我试图在我的SQLAlchemy模型类中使用未映射的属性。这就是我正在做的事情:
class Event(db.Model):
....
is_favourite = False
当我试图设置这个未映射的属性的值时,我有一个奇怪的行为。这就是发生的事情(假设我有3个事件的列表):
events[0].is_favourite = True
events[1].is_favourite = True
events[2].is_favourite = True
current_app.logger.info(events[0].is_favourite)
current_app.logger.info(events[1].is_favourite)
current_app.logger.info(events[2].is_favourite)
这些指纹:
真假真
当我期待
真真真
在我看来,这似乎是一种非常奇怪的行为,因为这只是一种阶级属性。为什么会发生这种事?有没有办法在SQLAlchemy中使用未映射的属性?
编辑
正如斯蒂芬在注释中指出的那样,实现这一目标的正确方法是使用重构函数。顺便说一句,我的问题在于查询本身,因为我正在迭代
Event.query.filter(Event.uuid.in_(events_uuids))
而不是
Event.query.filter(Event.uuid.in_(events_uuids)).all()
发布于 2020-03-04 19:07:57
即使将SQLAlchemy从等式中删除,通常也会将实例变量与类定义变量混淆。你可能也会遇到线程安全问题。
SQLAlchemy用模型对象在引擎盖下做了一些奇怪的事情。如果你想学得更多,这可能会给你指明正确的方向。
你可能想做的是:
from sqlalchemy.orm import reconstructor
class Event(db.Model):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.init_on_load()
@reconstructor
def init_on_load(self):
self.is_favourite = False
https://stackoverflow.com/questions/60528821
复制相似问题