我确实问过这个问题,但由于没有任何回应,我会再问一次
我正在使用Projects和Tickets表开发一个简单的flask应用,它们看起来像下面的
class Projects(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(100), nullable = False)
description = db.Column(db.Text, nullable = False)
created_by_id = db.Column(db.Integer, nullable = False)
expert_id = db.Column(db.Integer, db.ForeignKey('users.id'))
def __repr__(self):
return f"{self.title}"
class Tickets(db.Model):
id = db.Column(db.Integer,primary_key=True)
title = db.Column(db.String(100),nullable=False)
ticket_text = db.Column(db.Text,nullable=False)
date_posted = db.Column(db.DateTime,nullable=False,default=datetime.utcnow)
created_by_id = db.Column(db.Integer, nullable=False)
expert_id = db.Column(db.Integer, db.ForeignKey('users.id'),nullable=False)
project_id = db.Column(db.Integer, db.ForeignKey('projects.id'),nullable=False)
projects = db.relationship('Projects', backref='ticketso', lazy=True)
def __repr__(self):
return f"Tickets('{self.title}','{self.date_posted}')"
基本上这是一个项目,可以有许多票证,但是当我查询它时
@app.route('/project/<project_id>')
def project(project_id):
project = Projects.query.get_or_404(project_id)
return render_template('project.html',title=project.title, project=project)
并尝试显示它
<div class="jumbotron">
<h1>{{ project.title }}</h1>
<p>{{ project.description }}</p>
<p><a class="btn btn-primary btn-md">{{ project.created_by_id }}</a></p>
<p><a class="btn btn-primary btn-lg">{{ project.ticketso }}</a></p>
</div>
这里project.ticketso
将返回分配给该项目的票证列表,但会返回空列表
我的tickets.html
页可以成功显示分配给该特定票证的Project_id
这就是我将ticket
添加到项目中的方式
@app.route('/createTicket',methods=['GET','POST'])
def createTicket():
users = Users.query.all()
form = TicketForm()
if form.validate_on_submit():
ticket = Tickets(title=form.title.data,ticket_text=form.ticket_text.data,created_by_id=current_user.username,expert_id= str(form.user_id.data),project_id= str(form.project.data))
db.session.add(ticket)
db.session.commit()
flash('Your ticket has been created', 'success')
return redirect(url_for('index'))
return render_template('createTicket.html',title='Create a Ticket',form=form, users=users)
@app.route('/createProject',methods=['GET','POST'])
def createProject():
users = Users.query.all()
form = ProjectForm()
if form.validate_on_submit():
project = Projects(title = form.title.data, description = form.description.data, created_by_id = current_user.username, expert_id = str(form.user_id.data))
db.session.add(project)
db.session.commit()
flash('You project has been created', 'success')
return redirect(url_for('index'))
return render_template('createProject.html',form = form, users = users)
编辑: 为了清楚起见,我将以不同的方式提出这个问题。
class Person(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50), nullable=False)
addresses = db.relationship('Address', backref='person', lazy=True)
class Address(db.Model):
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(120), nullable=False)
person_id = db.Column(db.Integer, db.ForeignKey('person.id'),
nullable=False)
上面的代码来自烧瓶文档https://flask-sqlalchemy.palletsprojects.com/en/2.x/models/
它说明
backref is a simple way to also declare a new property on the Address class. You can then also use my_address.person to get to the person at that address
因此,我可以访问该person
中的address
,但是我们如何访问addresses
拥有的person
的列表。因为它是one to many relationship
,这意味着one person
可以有许多addresses
正确的?我们如何访问它们?
答案 0 :(得分:1)
您需要在两个表之间“连接”。创建行时,无需定义expert_id
。相反,您需要通过设置的Tickets
指向backref
表。
更改此行
project = Projects(title = form.title.data, description = form.description.data, created_by_id = current_user.username, expert_id = str(form.user_id.data))
对此:
project = Projects(title = form.title.data, description = form.description.data, created_by_id = current_user.username, ticketso=form)
假设form
是您要指向的Tickets对象。然后,您将可以使用Tickets
expert_id
的ID
基本上,此行projects = db.relationship('Projects', backref='ticketso', lazy=True)
在您设置的表中创建一个“虚拟列”。在这种情况下是Projects
表(您也可以使用关系列从Projcts
访问Tickets
表)。这两列也没有用。我假设您知道如何在没有它们的情况下访问数据。
expert_id = db.Column(db.Integer, db.ForeignKey('users.id'),nullable=False)
project_id = db.Column(db.Integer, db.ForeignKey('projects.id'),nullable=False)