flask-sqlalchemy 表之间的关系问题
flask-sqlalchemy relationship between tables issue
我正在尝试为可以管理有关其组织的某些设置的管理员构建仪表板。
下面是 2 tables,用户和组织,当有人注册时应该创建用户和组织之间的关系,但在我尝试注册后出现以下错误
(sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL 约束失败:user.org_id)
这很有道理,但我不确定如何创建用户和他所属的组织,并同时在用户 table 中添加组织 ID?
还是这个数据库设计有误?
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(20), nullable=False)
last_name = db.Column(db.String(20), nullable=False)
display_name = db.Column(db.String(40), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
date_joined = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
image_file = db.Column(db.String(20), nullable=False, default="default.jpg")
org_id = db.Column(db.Integer, db.ForeignKey("organization.id"), nullable=False)
class Organization(db.Model):
id = db.Column(db.Integer, primary_key=True)
domain = db.Column(db.String(20), unique=True, nullable=False)
date_joined = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
logo_file = db.Column(db.String(20), nullable=False, default="default.jpg")
sub_type = db.Column(db.String(20), nullable=False, default="Demo")
sub_start_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
sub_end_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
status = db.Column(db.String(20), nullable=False, default="Active")
admins = db.relationship("User", backref="admin", lazy=True)
def __repr__(self):
return f"User('{self.email}')"
@users.route("/register", methods=["GET", "POST"])
def register():
if current_user.is_authenticated:
return redirect(url_for("main.dashboard"))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode(
"utf-8"
)
organization = Organization(
domain=form.email.data.split("@")[1],
)
admin = User(
first_name=form.first_name.data,
last_name=form.last_name.data,
display_name=form.first_name.data + " " + form.last_name.data,
email=form.email.data,
password=hashed_password,
)
db.session.add(organization)
db.session.add(admin)
db.session.commit()
flash("Your account has been created! You are now able to log in", "success")
return redirect(url_for("users.login"))
return render_template("users/register.html", title="Register", form=form)
当您在 User.org_id 上将 nullable 设置为 False 时,您需要在首次创建用户时将其分配给 org_id。您应该先创建组织,然后创建用户并分配 org_id 给它。
您的代码应该看起来像这样
organization = Organization(
domain=form.email.data.split("@")[1],
)
db.session.add(organization)
db.session.commit() #Need to create the organization first to obtain the id
admin = User(
first_name=form.first_name.data,
last_name=form.last_name.data,
display_name=form.first_name.data + " " + form.last_name.data,
email=form.email.data,
password=hashed_password,
org_id=organization.id
)
db.session.add(admin)
db.session.commit()
我正在尝试为可以管理有关其组织的某些设置的管理员构建仪表板。
下面是 2 tables,用户和组织,当有人注册时应该创建用户和组织之间的关系,但在我尝试注册后出现以下错误 (sqlalchemy.exc.IntegrityError: (sqlite3.IntegrityError) NOT NULL 约束失败:user.org_id)
这很有道理,但我不确定如何创建用户和他所属的组织,并同时在用户 table 中添加组织 ID?
还是这个数据库设计有误?
class User(db.Model, UserMixin):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(20), nullable=False)
last_name = db.Column(db.String(20), nullable=False)
display_name = db.Column(db.String(40), nullable=False)
email = db.Column(db.String(120), unique=True, nullable=False)
password = db.Column(db.String(60), nullable=False)
date_joined = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
image_file = db.Column(db.String(20), nullable=False, default="default.jpg")
org_id = db.Column(db.Integer, db.ForeignKey("organization.id"), nullable=False)
class Organization(db.Model):
id = db.Column(db.Integer, primary_key=True)
domain = db.Column(db.String(20), unique=True, nullable=False)
date_joined = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
logo_file = db.Column(db.String(20), nullable=False, default="default.jpg")
sub_type = db.Column(db.String(20), nullable=False, default="Demo")
sub_start_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
sub_end_date = db.Column(db.DateTime, nullable=False, default=datetime.utcnow)
status = db.Column(db.String(20), nullable=False, default="Active")
admins = db.relationship("User", backref="admin", lazy=True)
def __repr__(self):
return f"User('{self.email}')"
@users.route("/register", methods=["GET", "POST"])
def register():
if current_user.is_authenticated:
return redirect(url_for("main.dashboard"))
form = RegistrationForm()
if form.validate_on_submit():
hashed_password = bcrypt.generate_password_hash(form.password.data).decode(
"utf-8"
)
organization = Organization(
domain=form.email.data.split("@")[1],
)
admin = User(
first_name=form.first_name.data,
last_name=form.last_name.data,
display_name=form.first_name.data + " " + form.last_name.data,
email=form.email.data,
password=hashed_password,
)
db.session.add(organization)
db.session.add(admin)
db.session.commit()
flash("Your account has been created! You are now able to log in", "success")
return redirect(url_for("users.login"))
return render_template("users/register.html", title="Register", form=form)
当您在 User.org_id 上将 nullable 设置为 False 时,您需要在首次创建用户时将其分配给 org_id。您应该先创建组织,然后创建用户并分配 org_id 给它。 您的代码应该看起来像这样
organization = Organization(
domain=form.email.data.split("@")[1],
)
db.session.add(organization)
db.session.commit() #Need to create the organization first to obtain the id
admin = User(
first_name=form.first_name.data,
last_name=form.last_name.data,
display_name=form.first_name.data + " " + form.last_name.data,
email=form.email.data,
password=hashed_password,
org_id=organization.id
)
db.session.add(admin)
db.session.commit()