[英]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.