【问题标题】:Display Models with Foreign Keys and Pagination显示带有外键和分页的模型
【发布时间】:2016-07-15 10:11:19
【问题描述】:

我有一个烧瓶、sqlalchemy、jinja2 应用程序,但存在以下问题。 我正在尝试在 html 表格中显示模型并对其进行分页。该模型中有一堆外键,所以在表中我看到了外键。我想显示模型的 __repr__ 或该模型的字段之一。
# models.py

class WorkLog(db.Model):
    __tablename__ = 'work_log'
    id = db.Column(db.Integer, primary_key=True)
    mechanic = db.Column(db.Integer, db.ForeignKey('users.id'))
    building_id = db.Column(db.Integer, db.ForeignKey('buildings.id'))
    elevator_id = db.Column(db.Integer, db.ForeignKey('elevators.id'))
    work_type_id = db.Column(db.Integer, db.ForeignKey('work_type.id'))
    component_id = db.Column(db.Integer, db.ForeignKey('component.id'))
    date = db.Column(db.Date(), default=datetime.utcnow().date())
    time_in = Column(TIME(), default=(datetime.utcnow() - timedelta(hours=4)).time())
    time_out = Column(TIME(), default=(datetime.utcnow() - timedelta(hours=2)).time())
    notes = db.Column(db.Text)

视图函数通过分页传递模型

#views.py

# build the time review table with pagination
    u = User.query.get(current_user.get_id())

    work_logs = u.work_log.paginate(page, 10, False).items

    return render_template('mechanic/mechanic.html', form=form, logs=work_logs)

模板的相关部分

mechanic.html

<table class="table table-striped">
                    <thead>
                        <tr>
                            <th>Building</th>
                            <th>Elevator</th>
                            <th>Work Type</th>
                            <th>Time In</th>
                            <th>Time Out</th>
                        </tr>
                    </thead>
                    <tbody>
                        {% for log in logs %}

                            <tr>
                                <td>{{ log.building_id }}</td>
                                <td>{{ log.elevator_id }}</td>
                                <td>{{ log.work_type_id }}</td>
                                <td>{{ log.time_in }}</td>
                                <td>{{ log.time_out }}</td>
                            </tr>
                        {% endfor %}
                    </tbody>
                </table>

结束 id 的三个字段是外键,并且希望显示该对象或字段的 __repr__。我最好的解决方法是什么。

【问题讨论】:

    标签: python flask sqlalchemy jinja2


    【解决方案1】:

    您只需要定义两个模型之间的关系——您已经定义了FK 关系,所以很简单:

    buildings = db.relationship('Buildings')
    

    将使您能够执行{{ log.buildings }} 以获取Buildings 对象的__repr__

    【讨论】:

    • 谢谢!我已经在使用relationship()backref= 选项的其他模型中建立了关系。所以我能够在模板中使用log.building 并且它起作用了。
    【解决方案2】:

    你需要给你的模型类添加一个别名函数来获取外键属性。

    class WorkLog(db.Model):
        __tablename__ = 'work_log'
        id = db.Column(db.Integer, primary_key=True)
        mechanic = db.Column(db.Integer, db.ForeignKey('users.id'))
        building_id = db.Column(db.Integer, db.ForeignKey('buildings.id'))
        elevator_id = db.Column(db.Integer, db.ForeignKey('elevators.id'))
    
        # ...
    
        @property
        def building(self):
            return Buildings.query.filter_by(id=self.bulding_id).first()
    
        @property
        def elevator(self):
            return Elevators.query.filter_by(id=self.elevator_id).first()
    
        # Repeat the same for other
        # ...
    

    在您的 HTML 中,您所要做的就是在类实例之后调用该函数。

      <tbody>
         {% for log in logs %}
          <tr>
             <td>{{ log.building }}</td>
             <td>{{ log.elevator }}</td>
             <!--- ... -->
        </tr>
      </tbody>                       
    

    【讨论】:

      猜你喜欢
      • 2019-12-29
      • 1970-01-01
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2018-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多