与特例Sqlalchamy的一对一关系

2024-09-30 16:21:05 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在设计一个数据库,其中user是超类,Customer和Admin继承user类。因此,根据SQLAlchemy中的documentation,我定义如下

用户类

class User(Base):
    __tablename__ = 'user'
    username = Column(String(40), primary_key=True)
    is_verified = Column(Boolean, default=True)
    type = Column(String(20), nullable=True)
    password = Column(String(40))
    first_name = Column(String(50), nullable=True)
    last_name = Column(String(50), nullable=True)
    image_url = Column(String(250), nullable=True)
    email = Column(String(100), nullable=True)
    phone = Column(String(15), nullable=True)
    addresses = relationship("Address", back_populates="user")
    customer = relationship("Customer", uselist=False, back_populates="user")
    admin = relationship("Admin", uselist=False, back_populates="user")

    def hash_password(self, password):
        self.password = pwd_context.encrypt(password)

    def verify_password(self, password):
        return pwd_context.verify(password, self.password)

客户类别

class Customer(Base):
    __tablename__ = 'customer'

    id = Column(Integer, primary_key=True)
    username = Column(String(40), ForeignKey('user.username'))
    user = relationship("User", back_populates="customer")
    products = relationship("Review")
    cart = relationship("Cart", uselist=False, back_populates="customer")

管理类

class Admin(Base):
    __tablename__ = 'admin'

    id = Column(Integer, primary_key=True)
    username = Column(String(20), ForeignKey('user.username'))
    user = relationship("User", back_populates="admin")

问题是用户和客户是一对一的,用户和管理员是一对一的。但我在用户类中无视admin和customer

此外,当我删除用户时,它不会自动删除客户

实现这个场景的正确方法是什么


Tags: 用户selftruestringadminbackusernamecolumn
1条回答
网友
1楼 · 发布于 2024-09-30 16:21:05

使用cascade="save-update, merge, delete"

delete级联表示当一个“父”对象被标记为删除时,它的相关“子”对象也应该被标记为删除。例如,如果我们有一个配置了delete cascade的关系User.addresses

class User(Base):
    __tablename__ = 'user'
    username = Column(String(40), primary_key=True)
    is_verified = Column(Boolean, default=True)
    type = Column(String(20), nullable=True)
    password = Column(String(40))
    first_name = Column(String(50), nullable=True)
    last_name = Column(String(50), nullable=True)
    image_url = Column(String(250), nullable=True)
    email = Column(String(100), nullable=True)
    phone = Column(String(15), nullable=True)
    addresses = relationship("Address", back_populates="user")
    customer = relationship("Customer", uselist=False, back_populates="user",cascade="save-update, merge, delete")
    admin = relationship("Admin", uselist=False, back_populates="user",cascade="save-update, merge, delete")

    def hash_password(self, password):
        self.password = pwd_context.encrypt(password)

    def verify_password(self, password):
        return pwd_context.verify(password, self.password)

相关问题 更多 >