【问题标题】:Creating One-to-Many relation in a Single Table Inheritance SQLAlchemy model在单表继承 SQLAlchemy 模型中创建一对多关系
【发布时间】:2020-12-07 00:28:16
【问题描述】:

我使用 SQLAlchemy 在下面的代码中创建了具有单表继承的模型。 我正在尝试创建一对多关系,其中Directory 可以包含许多由Bookmark.id 链接的Bookmarks

我希望模型允许我执行以下操作:

  1. Directory.childrenBookmark.children(仅当 BookmarkDirectory 时)会给我它包含的 Bookmarks。 (无论是Directory 还是Url
  2. Bookmark.parentDirectory.parentUrl.parent 将为我提供 BookmarkDirectoryUrl 的父级 Directory

这是我第一次使用单表继承,所以我可能犯了一个愚蠢的错误。

目前我知道以下问题:

  1. Directory.children 获取父目录。
  2. Directory.parent 获取子目录,但不包含任何 url。

这是我的代码:

class Bookmark(Base):

    __tablename__ = "Bookmark"

    id = Column(Integer, primary_key=True)
    title = Column(String(256))
    date_added = Column(DateTime, nullable=False, default=datetime.utcnow)
    position = Column(Integer)
    parent_id = Column(Integer, sqlalchemy.ForeignKey("Bookmark.id"))
    type = Column(String)

    __mapper_args__ = {"polymorphic_on": type, "polymorphic_identity": "bookmark"}

class Url(Bookmark):

    url = Column(String(500))
    icon = Column(String)
    icon_uri = Column(String)
    tags = Column(String(500))

    __mapper_args__ = {"polymorphic_identity": "url"}

class Directory(Bookmark):

    children = relationship(
        "Bookmark",
        cascade="save-update, merge, delete",
        backref="parent",
        lazy=False,
        remote_side="Bookmark.id",
    )
    __mapper_args__ = {"polymorphic_identity": "directory"}

编辑:

所以我解决了我的问题的很大一部分,我不知道这是否是最好的方法,但这里就是这样。

  1. 我将关系名称及其后向引用children/parent 切换为parent/children,如下所示
parent = relationship(
        "Bookmark",
        cascade="save-update, merge, delete",
        backref="children",
        lazy=False,
        remote_side="Bookmark.id",
    )
  1. 我将关系的位置从 Directory 类更改为 Bookmark 类。

但是现在Url 类也有一个.children 属性。 有没有办法解决这个问题?

【问题讨论】:

    标签: python python-3.x database sqlalchemy


    【解决方案1】:

    我通过执行以下操作解决了大部分问题:

    1. 我将关系名称及其后向引用children/parent 切换为parent/children,如下所示
    parent = relationship(
            "Bookmark",
            cascade="save-update, merge, delete",
            backref="children",
            lazy=False,
            remote_side="Bookmark.id",
        )
    
    1. 我将关系的位置从Directory 类更改为Bookmark 类。

    但是现在Url 类也有一个.children 属性。 (这是我不想要的) 可能有更好的解决方案,但现在我将不得不这样做。

    【讨论】:

      猜你喜欢
      • 2011-10-10
      • 2020-03-15
      • 1970-01-01
      • 1970-01-01
      • 2016-03-31
      • 1970-01-01
      • 2011-03-11
      • 1970-01-01
      • 2019-01-12
      相关资源
      最近更新 更多