簡體   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