打印出加入烧瓶的结果
Printing out the results of a join in flask
我正在制作一个 flask 应用程序,每个用户都可以在其中将他的员工添加到列表中。我有两个表:用户和员工,它们看起来像这样:
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
emps = db.relationship('Employee', backref = 'boss', lazy = 'dynamic')
def __repr__(self):
return '<User {}'.format(self.username)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Employee(db.Model):
__tablename__ = 'Employees'
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(64), index=True)
last_name = db.Column(db.String(64), index=True)
User_id = db.Column(db.Integer, db.ForeignKey(User.id))
def __repr__(self):
return '<Employee {0} {1}>'.format(self.first_name, self.last_name)
我尝试将此添加到我的用户 class 以便我可以加入这两个表:
def user_employees(self):
user_emps = User.query.join(Employee, User.id == Employee.User_id).filter(User.id == Employee.User_id)
return user_emps
在我的 html 文件中我有这个:
{% block content %}
{% for employee in employees %}
<div>{{ employee }}</div>
{% endfor %}
{% endblock %}
这是视图函数:
def Show_Employees():
employees = current_user.user_employees()
return render_template('emps.html', employees = employees)
但是这不起作用。我的页面上只写了这个:
<User test
预期的输出将是员工的名字和姓氏。
我想问题出在连接上,但我无法弄清楚。有没有人遇到过类似的情况?
您无需担心手动加入,SQLalchemy 会为您处理所有这些。您可以通过 user.emps
访问用户员工,其中 returns 员工列表。我放弃了很多您的代码,您可以再次添加这些代码,只是为了让示例更小且易于理解。功能齐全:
from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
app = Flask(__name__)
db = SQLAlchemy(app)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
emps = db.relationship('Employee', backref = 'boss', lazy = 'dynamic')
class Employee(db.Model):
__tablename__ = 'Employees'
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(64), index=True)
User_id = db.Column(db.Integer, db.ForeignKey(User.id))
db.create_all() # creates the database tables, not needed if you already have them
boss1 = User()
boss1.username = 'Mr Boss'
employee1 = Employee()
employee1.first_name = 'Mr peanut'
employee2 = Employee()
employee2.first_name = 'Mr butter'
boss1.emps = [employee1, employee2] # here is where you're binding the employees to the user
db.session.add(boss1)
db.session.commit()
@app.route('/')
def index():
user = User.query.get(1) # this returns the user with id1, which is 'Mr boss'
return render_template_string('''
This is user {{user.username}}<br>
His empoyees are:
{% for employee in user.emps %}
<div>{{ employee.first_name }}</div>
{% endfor %}
''', user=user)
app.run()
如果您访问该站点,将打印出:
This is user Mr Boss
His empoyees are:
Mr peanut
Mr butter
我正在制作一个 flask 应用程序,每个用户都可以在其中将他的员工添加到列表中。我有两个表:用户和员工,它们看起来像这样:
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
emps = db.relationship('Employee', backref = 'boss', lazy = 'dynamic')
def __repr__(self):
return '<User {}'.format(self.username)
def set_password(self, password):
self.password_hash = generate_password_hash(password)
def check_password(self, password):
return check_password_hash(self.password_hash, password)
class Employee(db.Model):
__tablename__ = 'Employees'
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(64), index=True)
last_name = db.Column(db.String(64), index=True)
User_id = db.Column(db.Integer, db.ForeignKey(User.id))
def __repr__(self):
return '<Employee {0} {1}>'.format(self.first_name, self.last_name)
我尝试将此添加到我的用户 class 以便我可以加入这两个表:
def user_employees(self):
user_emps = User.query.join(Employee, User.id == Employee.User_id).filter(User.id == Employee.User_id)
return user_emps
在我的 html 文件中我有这个:
{% block content %}
{% for employee in employees %}
<div>{{ employee }}</div>
{% endfor %}
{% endblock %}
这是视图函数:
def Show_Employees():
employees = current_user.user_employees()
return render_template('emps.html', employees = employees)
但是这不起作用。我的页面上只写了这个:
<User test
预期的输出将是员工的名字和姓氏。 我想问题出在连接上,但我无法弄清楚。有没有人遇到过类似的情况?
您无需担心手动加入,SQLalchemy 会为您处理所有这些。您可以通过 user.emps
访问用户员工,其中 returns 员工列表。我放弃了很多您的代码,您可以再次添加这些代码,只是为了让示例更小且易于理解。功能齐全:
from flask import Flask, render_template_string
from flask_sqlalchemy import SQLAlchemy
from flask_login import UserMixin
app = Flask(__name__)
db = SQLAlchemy(app)
class User(UserMixin, db.Model):
id = db.Column(db.Integer, primary_key=True)
username = db.Column(db.String(64), index=True, unique=True)
emps = db.relationship('Employee', backref = 'boss', lazy = 'dynamic')
class Employee(db.Model):
__tablename__ = 'Employees'
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(64), index=True)
User_id = db.Column(db.Integer, db.ForeignKey(User.id))
db.create_all() # creates the database tables, not needed if you already have them
boss1 = User()
boss1.username = 'Mr Boss'
employee1 = Employee()
employee1.first_name = 'Mr peanut'
employee2 = Employee()
employee2.first_name = 'Mr butter'
boss1.emps = [employee1, employee2] # here is where you're binding the employees to the user
db.session.add(boss1)
db.session.commit()
@app.route('/')
def index():
user = User.query.get(1) # this returns the user with id1, which is 'Mr boss'
return render_template_string('''
This is user {{user.username}}<br>
His empoyees are:
{% for employee in user.emps %}
<div>{{ employee.first_name }}</div>
{% endfor %}
''', user=user)
app.run()
如果您访问该站点,将打印出:
This is user Mr Boss
His empoyees are:
Mr peanut
Mr butter