0

情况如下。我有一个包含两个列表的表,包括与另一个表的关系。一个子条目可以有一个或两个父母(主要是两个;)。父母区分每个家庭的孩子。这个结构是固定的。

现在我想要一个名为 all_children 的列,它直接在同一个表中包含所有家庭的所有孩子(因为直接石墨烯集成)。有两种主要方法:column_property 或 hybrid_property。但不幸的是,所有使用这两种方法的测试,例如简单地将两个列表与 python 连接的幼稚想法都失败了

class Parent(Base):

    id = Column(Integer, primary_key=True, autoincrement="auto")
    children_family_1 = relationship(Child, backref='child_1', cascade='all, delete', lazy='select', foreign_keys='[Child.ref_1_id]')
    children_family_2 relationship(Child, backref='child_2', cascade='all, delete', lazy='select', foreign_keys='[Child.ref_2_id]')
    all_children = column_property(children_family_1 + children_family_2)

    @hybrid_property
    def all_children(self):
         return self.children_family_1 + self.children_family_2

    @all_children.expression
    def all_children(cls):
         return select(??)


class Child(Base):

    id = Column(Integer, primary_key=True, autoincrement="auto")
    ref_1_id = Column(Integer, ForeignKey('parent.id'))
    ref_2_id = Column(Integer, ForeignKey('parent.id'))

看来,我实际上没有足够的 sqlalchemy 知识来评估和实施正确的方法。请告诉我,我应该在这个用例中使用哪个以及如何按照描述实现它。提前致谢。

4

1 回答 1

0
@hybrid_property
def children(self) -> [Child]:
    if self.children_family_1 is None:
        self.children_family_1 = []

    if self.children_family_2 is None:
        self.children_family_2 = []

    return self.children_family_1 + self.children_family_2

    @children.expression
    def children(cls) -> [Child]:
        return (
            select().where(
                or_(
                    Child.ref_1_id == cls.id,
                    Child.ref_2_id == cls.id
                )
            )
        )

感谢您对差异的解释-> https://martinheinz.dev/blog/28

于 2022-01-31T21:27:32.247 回答