【问题标题】:Accessing extra data in a sqlalchemy associated object访问 sqlalchemy 关联对象中的额外数据
【发布时间】:2017-07-02 21:04:38
【问题描述】:

User 对象可以通过多种不同方式与Project 相关,由Job 关联表指定。在我的模板文件中,我试图遍历current_user.projects 中的所有项目,并为每个项目指定Job 是该项目中该用户的内容......但我无法获得正确的语法.

模型

class Project(db.Model):
    id = db.Column(db.Integer(), primary_key=True)
    title = db.Column(db.String(80))
    users = db.relationship("Job", back_populates="project")

class User(db.Model, UserMixin):
    id = db.Column(db.Integer, primary_key=True)
    first_name = db.Column(db.String(155))
    last_name = db.Column(db.String(155))
    email = db.Column(db.String(255), unique=True)
    password = db.Column(db.String(255))
    projects = db.relationship("Job", back_populates="user")

# defines a user's role related to each assigned project
class Job(db.Model):
    __tablename__ = 'job'
    user_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'), primary_key=True)
    job = db.Column(db.String(50))
    user = db.relationship("User", back_populates="projects")
    project = db.relationship("Project", back_populates="users")

    def __init__(self, user_id, project_id, job="client"):
        self.user_id = user_id
        self.project_id = project_id
        self.job = job

查看

@app.route('/projects')
@login_required
def projects():
    projects = Project.query.join(Job).filter_by(user_id=current_user.id).all() 
    # current_user.projects would probably do the same thing            
    return render_template('project/projects.html', projects=projects)

模板

<div class="accordion style-two gradient-bg">
    <div class="panel-group" id="accordion-2">
        {% for project in projects %}
        <div class="panel panel-default">
            <!-- Accordian Title -->
            <div class="panel-heading">
                <div class="panel-title">
                    <a class="accordion-toggle collapsed" href="#{{ project.id }}" data-parent="#accordion-2" data-toggle="collapse" aria-expanded="false">
                        {{ project }} - HELP NEEDED HERE--> ({{ project.user[0].job }})
                    </a>
                </div>
            </div>
            <!-- Accordian Detail -->
            <div id="{{ project.id }}" class="panel-collapse collapse">
                <div class="panel-body">
                    <div class="container">
                        <div class="row">
                        <p>Lorem ipsum dolor sit amet, ei vis iriure phaedrum, sea no regione delicata sadipscing. Minim imperdiet vix ad, pro ei utinam dicunt epicurei. Vide affert debitis has ex. Vel ut consul molestiae pertinacia. Duo graeci dictas consulatu in, ei veniam singulis qui, decore numquam duo id.</p>                        
                        <p>Prima tritani veritus id pro, elitr hendrerit comprehensam ei per. Doming integre aliquando has at. Ea eam aeterno lobortis, ea est mutat laudem semper. Pertinax urbanitas nec ne, quo aliquip voluptaria scriptorem ut. Ut mel tractatos reprimique contentiones, adhuc nulla apeirian usu no, mel imperdiet molestiae abhorreant ut.</p> 
                        </div>
                    </div>
                </div>
            </div>
        </div>
        {% endfor %}
   </div>
</div>

如上所示,我有project.users[0].job,它将显示正确的信息,因为我在系统中只有一个用户。当我循环通过projects 时,如何在模板级别上指定我正在寻找与current_user 关联的工作?谢谢!

【问题讨论】:

  • Iiuc 我认为您应该查询与当前用户相关的工作,加入他们的项目,而不是查询项目,然后尝试遍历所有相关工作以寻找属于当前用户的工作.
  • 完全正确,谢谢!

标签: python flask sqlalchemy flask-sqlalchemy associated-object


【解决方案1】:

按照 cmets 中的建议,最简单的方法是简单地查询关联表以开头:projects = Job.query.filter_by(user_id=current_user.id).all()

我可以随时访问引用的每个Project (project.project),还可以获得工作的详细信息 (project.job)。

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 2019-10-16
    • 1970-01-01
    • 1970-01-01
    • 2021-12-09
    • 1970-01-01
    • 2018-11-24
    • 2014-01-16
    • 2012-01-21
    相关资源
    最近更新 更多