Отношения один к одному с особыми случаями Sqlalchamy - PullRequest
0 голосов
/ 22 марта 2019

Я проектирую базу данных, в которой пользователь является суперклассом, а клиент и администратор наследуют класс пользователя.Итак, в соответствии с документацией в SQL SQLAlchemy я определяю так:

Класс пользователя

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 в классе пользователя.

Далее, когда я удаляю пользователя, он не удаляет клиента автоматически.

Как правильно реализовать этот сценарий?

1 Ответ

0 голосов
/ 22 марта 2019

use 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...