Flask обратный возврат пустой список - PullRequest
0 голосов
/ 14 июля 2020

Я задал этот вопрос, но собираюсь задать его еще раз, так как не получил ответа

Я разрабатываю простое приложение 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)

Код выше я получил из 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, но как нам получить доступ к списку addresses имеет person. Поскольку это one to many relationship, это означает, что one person может иметь много addresses правильно? как получить к ним доступ?

1 Ответ

1 голос
/ 15 июля 2020

Вам необходимо «соединить» 2 таблицы. Вам не нужно определять expert_id при создании строки. вместо этого вам нужно указать на Tickets Table с помощью 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

в основном, эта строка 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...