烧瓶backref重现空白列表

时间:2020-07-14 19:56:35

标签: python-3.x flask flask-sqlalchemy

我确实问过这个问题,但由于没有任何回应,我会再问一次

我正在使用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正确的?我们如何访问它们?

1 个答案:

答案 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)