繁体   English   中英

从联接表查询的SQLAlchemy hybrid_property的设置方法

[英]Setter for a SQLAlchemy hybrid_property that queries from a joined table

我正在尝试使用SQLAlchemy中的一组状态为任务建模。 我有以下内容:

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.ext.hybrid import hybrid_property
from sqlalchemy.orm import relationship, backref

Base = declarative_base()

class Task(Base):
    __tablename__ = 'task'

    statusId = Column(Integer, ForeignKey('status.id'))
    status = relationship('Status', backref=backref('status'), lazy='joined')

    @hybrid_property
    def statusName(self):
        return self.status.name

class Status(Base):
    __tablename__ = 'status'

    id = Column(Integer, primary_key=True)
    name = Column(String(32), unique=True)

状态表填充在数据库中,并且是静态的:

+----+--------------+
| id | name         |
+----+--------------+
|  1 | unassigned   |
|  2 | pending      |
|  3 | working      |
|  4 | failed       |
|  5 | done         |
+----+--------------+

我想要做的是按名称而不是ID引用状态名称。 因此,当Task的状态更改时,我想编写task.statusName = 'working'而不是task.statusId = 3 我不确定如何为此做一个statusName的setter。 因为设置器的定义取决于Status表中当前的行,这是否违反了ORM的设计?

您可以稍微更改数据库结构以达到预期的效果。 看来您的身份是自然的。 该名称实际上是主键。

class Task(Base):
    __tablename__ = 'task'

    status = Column(String(32), ForeignKey('status.name'))

class Status(Base):
    __tablename__ = 'status'

    name = Column(String(32), primary_key=True)

然后,您可以轻松地将状态设置为:

task = Task()
task.status = 'error'

如果状态仍然不可用,因为仍然存在外键约束,这也会引发异常。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM