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