flask вопросы отношения один к одному - PullRequest
1 голос
/ 09 марта 2020

Я пытаюсь установить отношения один-к-одному в flask. У меня есть скрипт, который запускается db.drop_all(), когда я хочу очистить свою БД. Но я получаю каскадные ошибки при этом. Я играл со многими комбинациями, используя аргументы cascade и single_parent в отношениях модели, и ничего не работает. Буду признателен за любую помощь, чтобы помочь установить отношения один-к-одному, что позволит мне использовать db.drop_all() без ошибок. Ниже моя последняя итерация.

from sqlalchemy.sql import func
from project import db, bcrypt


class User(db.Model):

    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(150), nullable=False)
    password = db.Column(db.String(250), nullable=False)
    active = db.Column(db.Boolean(), default=True, nullable=False)
    created_date = db.Column(db.DateTime, default=func.now(), nullable=False)
    profile = db.relationship("Profile", cascade="all, delete, delete-orphan")


    def __init__(self, email, password):
        self.email = email
        self.password = bcrypt.generate_password_hash(password).decode('utf-8')



class Profile(db.Model):

    __tablename__ = 'profile'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    first_name = db.Column(db.String(150), nullable=True)
    last_name = db.Column(db.String(250), nullable=True)
    github_url = db.Column(db.String(250), nullable=True)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    user = db.relationship("User")

1 Ответ

2 голосов
/ 09 марта 2020
from sqlalchemy.sql import func
from project import db, bcrypt


class User(db.Model):

    __tablename__ = 'user'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    email = db.Column(db.String(150), nullable=False)
    ...

    def __init__(self, email, password):
        self.email = email
        self.password = bcrypt.generate_password_hash(password).decode('utf-8')



class Profile(db.Model):

    __tablename__ = 'profile'

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    first_name = db.Column(db.String(150), nullable=True)
    user_id = db.Column(db.Integer, db.ForeignKey("user.id"), nullable=False)
    ...

    user = db.relationship(
        'User', cascade='all', backref=db.backref('profile', cascade='all'))

обратите внимание, как взаимосвязь между двумя моделями определяется только в модели профиля.

...