Flask 如何记录到具有一对多关系的数据库?

Flask 如何记录到具有一对多关系的数据库?,flask,flask-sqlalchemy,python-3.7,Flask,Flask Sqlalchemy,Python 3.7,我正在尝试做一个小项目,但在SQLAlchemy中的数据库结构方面有一些困难。我有两个数据库模型(代码如下) 用户模型将在注册表期间创建并添加到数据库中 然后我需要找到一种方法,从loggedin用户的个人资料中为他添加客户端 问题: 我该怎么做?我需要专门为登录用户创建一个记录。因此,当我显示它们(他的客户机)时,它们只显示给那个特定的用户 类用户(UserMixin,db.Model): tablename='user' id = db.Column(db.Integer, primary_

我正在尝试做一个小项目,但在SQLAlchemy中的数据库结构方面有一些困难。我有两个数据库模型(代码如下)

  • 用户模型将在注册表期间创建并添加到数据库中
  • 然后我需要找到一种方法,从loggedin用户的个人资料中为他添加客户端
  • 问题: 我该怎么做?我需要专门为登录用户创建一个记录。因此,当我显示它们(他的客户机)时,它们只显示给那个特定的用户

    类用户(UserMixin,db.Model): tablename='user'

    id = db.Column(db.Integer, primary_key=True)
    company_name = db.Column(db.String(120), index=True, unique=False)
    email = db.Column(db.String(120), index=True, unique=True)
    password_hash = db.Column(db.String(128))
    clients = db.relationship('Client', backref='invoice_clients', lazy='dynamic')
    
    类客户端(db.Model): tablename='client'

    id = db.Column(db.Integer, primary_key=True)
    client_name = db.Column(db.String(140))
    client_company = db.Column(db.String(140))
    client_email = db.Column(db.String(140))
    invoice_amount = db.Column(db.Integer)
    service_description = db.Column(db.String)
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'))
    

    我预计,当用户从其配置文件页面添加客户端时,它将仅为他记录在数据库中。

    首先,我相信您将
    backref
    参数向后设置。这是可以在被引用对象上使用的属性,用于“返回”到当前类。所以它应该是这样的:

    class User(UserMixin, db.Model):
        __tablename__ = 'user'
    
        clients = db.relationship('Client', backref='user', lazy='dynamic')
    
    关于为特定用户添加客户端的问题,有两种方法可以解决。您可以手动执行此操作:

    # Or flask_login, or whatever you're using for user management
    from flask_security import current_user
    
    new_client = Client(client_name="Lancelot", user_id=current_user.id)
    db.session.add(new_client)
    db.session.commit()
    
    或者,您可以简单地使用SQLAlchemy将客户端附加到您的用户。声明的外键将导致自动分配id:

    from flask_security import current_user
    
    new_client = Client(client_name="Sir Bedivere")
    current_user.clients.append(new_client)
    db.session.commit()