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、もちろん追加できます。でも、それまでは放置しておいたほうがよさそうです。

「まあ、名前を入れるだけで構いません」と言うことができます。それが私たちがやっていることです。2つのこと:

  1. そのためだけに命名規則を定義する必要があります。これにより、プラグインの名前がUserクラス上で他のプラグインや主要な属性と競合しないようになります。
  2. 物事を読み書きしやすくします。

小さな更新:目前の問題に対するテストされていない解決策は、次の行の mixin ですが、名前のないbackrefの問題には答えません。

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