同时创建 parent 和 child。烧瓶 SQLAlchemy

Creating parent and child at the same time. Flask SqlAlchemy

我创建了下面的模型来将用户和配置文件数据分别存储在我的数据库中

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(40), unique=True)
    password = db.Column(db.String(255))
    profile = db.relationship('Profile', backref='Profile', uselist=False)

class Profile(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(25))
    last_name = db.Column(db.String(25))
    email = db.Column(db.String(25), unique=True)
    phone_number = db.Column(db.String(25), unique=True)
    post_code = db.Column(db.String(25))
    house_number = db.Column(db.String(25))
    user = db.Column(db.Integer, db.ForeignKey('user.id'))

我曾尝试通过此方法填充配置文件模型,但是它不起作用。

@routes.route('/register', methods = ['POST'])
def register():
    if request.method == 'POST':
        
        data = request.get_json()
        new_user = User(username = data['username'], password = data['password'])
        new_user.profile.first_name = data['first_name']
        new_user.profile.last_name = data['last_name']
        new_user.profile.email = data['email']
        new_user.profile.phone_number = data['phone_number']
        new_user.profile.post_code = data['post_code']
        new_user.profile.house_number = data['house_number']
        db.session.add(new_user)
        db.session.commit()
             
        return {'msg' : 'sucess'}

我收到这个错误,请你解释一下我做错了什么?我注意到我的数据库中不存在 User.profile 列,但是,我认为这对于 ForiegnKey 来说是正常的吗?

  File "C:\routes\register.py", line 11, in register
    new_user.profile.first_name = data['first_name']
AttributeError: 'NoneType' object has no attribute 'first_name'

有什么解决办法?我假设我需要单独创建 Profile() 模型,但我如何同时 link 未提交的 User() 模型?

有几种方法可以做到这一点,但您可能想为初始化 Profile 对象的用户创建一个 __init__(...)

像这样...

class User(db.Model):
    __tablename__ = "user"
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(40), unique=True)
    password = db.Column(db.String(255))
    profile = db.relationship('Profile', backref='Profile', uselist=False)

    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.profile = Profile()