与特殊情况Sqlalchemy的一对一关系

问题描述 投票:0回答:1

我正在设计一个数据库,其中用户是超类,而Customer和Admin是继承User类。所以根据SQL 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")

问题是用户和客户是一对一的,用户和管理员是一对一的。但我在用户类中违反了管理员和客户。

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

实现此方案的正确方法是什么?

python sqlalchemy
1个回答
0
投票

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

删除级联指示当“父”对象被标记为删除时,其相关的“子”对象也应标记为删除。例如,如果我们有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)
© www.soinside.com 2019 - 2024. All rights reserved.