7

我们为注册到系统的人提供了一个 User 类。而且我们有大量属于用户的类(和插件添加更多)。所以如果一个用户被删除了,他的东西也应该被删除。这就是我们目前正在做的事情:

class User(Base):
    id = Column(Integer, primary_key=True)
class Thing(Base):
    user_id = Column(Integer, ForeignKey(User.id))
    user = relationship(
        User,
        backref=backref("list_of_things",
            cascade="all, delete-orphan"))

这行得通。

假设我们从不使用User.list_of_things: 有没有办法把它排除在外?但仍然得到 backref 级联行为?如果我们需要User.list_of_things,当然可以添加它。但在那之前,最好把它排除在外。

你可以说“好吧,只要输入一个名字,不要在意”。这就是我们正在做的事情。两件事情:

  1. 我们需要为那个东西定义一个命名约定,这样插件的名称就不会在User类上与其他插件和/或我们的主要属性发生冲突。
  2. 会使事情更容易读/写。

小更新:对于我们手头的问题,一个未经测试的解决方案将是一个 mixin,但它不会回答没有名称的 backrefs 的问题:

class OwnedbyUserMixin(object):
    @declared_attr
    def user_id(cls):
        return Column(Integer, ForeignKey(User.id),
            nullable=False)

    @declared_attr
    def user(cls):
        return relationship(
            User,
            backref=backref("list_of_" + cls.__tablename__,
                cascade="all, delete-orphan"))
4

0 回答 0