首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >SQLAlchemy无法设置未映射的属性

SQLAlchemy无法设置未映射的属性
EN

Stack Overflow用户
提问于 2020-03-04 14:56:55
回答 1查看 188关注 0票数 0

我试图在我的SQLAlchemy模型类中使用未映射的属性。这就是我正在做的事情:

代码语言:javascript
运行
复制
class Event(db.Model):
    ....
    is_favourite = False

当我试图设置这个未映射的属性的值时,我有一个奇怪的行为。这就是发生的事情(假设我有3个事件的列表):

代码语言:javascript
运行
复制
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中使用未映射的属性?

编辑

正如斯蒂芬在注释中指出的那样,实现这一目标的正确方法是使用重构函数。顺便说一句,我的问题在于查询本身,因为我正在迭代

代码语言:javascript
运行
复制
Event.query.filter(Event.uuid.in_(events_uuids)) 

而不是

代码语言:javascript
运行
复制
Event.query.filter(Event.uuid.in_(events_uuids)).all()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-04 19:07:57

即使将SQLAlchemy从等式中删除,通常也会将实例变量与类定义变量混淆。你可能也会遇到线程安全问题。

SQLAlchemy用模型对象在引擎盖下做了一些奇怪的事情。如果你想学得更多,这可能会给你指明正确的方向。

你可能想做的是:

代码语言:javascript
运行
复制
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
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60528821

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档