如何记录以一对多关系记录到数据库?

时间:2019-10-31 22:34:15

标签: flask flask-sqlalchemy python-3.7

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

  1. 创建用户模型并将其添加到注册表单中。
  2. 然后,我需要找到一种方法,可以从他的个人资料中为登录用户添加客户端。

问题: 我怎么做?我需要专门为登录用户创建一条记录。这样,当我显示它们(他的客户)时,它们只会显示给该特定用户。

类用户(UserMixin,db.Model):     表名 ='用户'

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')

类Client(db.Model):     表名 ='客户端'

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'))

我希望当用户从其个人资料页面添加客户端时-该客户端仅会为他记录在数据库中。

1 个答案:

答案 0 :(得分:0)

首先,我相信您的参数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()