【问题标题】:Flask backref returing empty listFlask backref 返回空列表
【发布时间】:2020-07-14 19:56:35
【问题描述】:

我确实问过这个问题,但我会再问一次,因为没有得到任何回应

我正在开发一个带有项目和工单表的简单烧瓶应用程序,它们如下所示

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 应该返回分配给该项目的票证列表,但它返回的是 emtpy 列表

我的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)

上面的代码是我从flask文档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,但是我们如何访问person 拥有的addresses 列表。因为是one to many relationship,所以one person可以有很多addresses对吗?我们如何访问它们?

【问题讨论】:

  • 我很困惑...你想做什么?您要查找哪一列?您正在尝试通过Projects 查找用户的Tickets
  • 你能告诉我们你是如何向表格中添加新对象的吗?
  • @Patch 我正在尝试查找分配给该项目的工单列表
  • @Patch,谢谢我已经更新了问题,请检查一下
  • 好的,你在哪里添加项目?

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


【解决方案1】:

您需要在 2 个表之间“连接”。创建行时不需要定义expert_id。相反,您需要通过您设置的backref 指向Tickets 表。 改变这一行

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 对象。然后,您将能够通过expert_id 获取Tickets 的ID

基本上,这一行projects = db.relationship('Projects', backref='ticketso', lazy=True) 在您设置的表中创建了一个“虚拟列”。在这种情况下是Projects 表(您也可以使用关系列从Tickets 访问Projcts 表)。这两个列也是无用的。我假设您知道如何在没有它们的情况下访问数据。

expert_id = db.Column(db.Integer, db.ForeignKey('users.id'),nullable=False)
project_id = db.Column(db.Integer, db.ForeignKey('projects.id'),nullable=False)

【讨论】:

  • 我所做的一切都与您在上面显示的完全相同。在 project.html 中,我使用 jinja 显示票证列表:{{project.ticketso}},它仍然给我空列表。我也试过 {{project.ticketso.title}} 仍然没有结果。
  • 我使用expert_id是因为要与用户列建立关系
  • expert_id 是票证分配给的用户。跟项目没有关系,我在编辑后更新了帖子,可能是我对这个问题不清楚,请看一下,也许可以说清楚
  • @MuhammedTech 我没有看到将票分配给的用户。您可以通过打印ticket_obj.projcets 访问工单所包含的项目列表。还要在procjets 中创建一个expert_tick = db.Column(db.Integer, db.ForeignKey('tickets.id')) 列,它应该可以工作。
  • 我相信这会奏效,我现在就试试。但是,这将是一种什么样的关系?我们不是在“许多”方面使用 db.ForeignKey,在我的情况下是“Tickets”,它已经有 project_id = db.Column(db.Integer, db.ForeignKey('projects.id'),nullable=False)现在如果我在 Project 上添加一个新的 db.Column(db.Integer, db.ForeignKey('tickets.id')) ,它仍然是一对多的关系吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-16
  • 2021-03-22
  • 2019-08-15
  • 2020-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多