day04-models一对多、分页

1 数据的分页

view.py

@blue.route('/page/')
def page():
    if request.method == "GET":
        '''分页'''
        page = int(request.args.get('page', 1))
      '''1.offsite +limit'''
        Students.query.offset((page - 1) * 2).limit(2)

        # 2.切片
        stus = Students.query.all()[(page - 1) * 2:page * 2]

        # 3.sql
        sql = 'select * from students limit %s,%s ' % ((page - 1) * 2, 2)

        ''' 4. paginate()方法'''
        paginate = Students.query.paginate(page, 2)
        stus = paginate.items

        return render_template('page.html', stus=stus, paginate=paginate)

page.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<table>
    <thead>
    <th>ID</th>
    <th>姓名</th>
    <th>年龄</th>
    </thead>
    {% for stu in stus %}
    <tbody>
    <td>{{stu.id}}</td>
    <td>{{stu.s_name}}</td>
    <td>{{stu.s_age}}</td>

    </tbody>
    {% endfor %}
</table>
<p>当前{{ paginate.page }}页,共{{ paginate.pages}}页</p>
{% if paginate.has_prev %}
<a href="{{url_for('app.page')}}?page={{paginate.prev_num}}">上一页</a>
{% endif %}

{% if paginate.has_next %}
<a href="{{url_for('app.page')}}?page={{paginate.next_num}}">下一页</a>
{% endif %}
</body>
</html>

2 关联关系

2.1创建关联模型

班级模型

class Grade(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    g_name = db.Column(db.Integer, unique=True, nullable=False)
    students = db.relationship('Students', backref='grade', lazy=True)
    __tablename__ = 'grade'

注意:表的外键由db.ForeignKey指定,传入的参数是表的字段db.relations它声明的属性不作为表字段,第一个参数是关联类的名字backref是一个反向身份的代理,相当于在Student类中添加了grade的属性。例如,有Grade实例dept和Student实例grade。dept.students.count()将会返回学院学生人数;stu.stu.first()将会返回学生的学院信息的Grade类实例。一般来讲db.relationship()会放在一这一边。
lazy
官网解释有如下几个lazy的参数:

lazy 决定了 SQLAlchemy 什么时候从数据库中加载数据:,有如下四个值:

select 就是访问到属性的时候,就会全部加载该属性的数据。

joined 则是在对关联的两个表进行join操作,从而获取到所有相关的对象。

dynamic 则不一样,在访问属性的时候,并没有在内存中加载数据,而是返回一个query对象, 需要执行相应方法才可以获取对象,

2.2 学生模型

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    s_name = db.Column(db.String(10), unique=False, nullable=False)
    s_age = db.Column(db.Integer, default=19)
    s_g = db.Column(db.Integer, db.ForeignKey('grade.id'), nullable=True)
    __tablename__ = 'students'

    def save(self):
        db.session.add(self)
        db.session.commit()

通过班级查学生信息


@blue.route('/sel_stu_by_grade')
def sel_stu_by_grade():
    # 通过班级查找学生
    grade = Grade.query.filter(Grade.g_name == '物联网').frist()
    stus = grade.students
    return '通过班级查找学生信息'

通过学生查找班级信息

@blue.route('/sel_grade_by_stu/')
def sel_grade_by_stu():
    stu = Students.query.get(5)
    # 获取班级,学生对象.backref
    grade = stu.grade
    return '通过学生获取班级信息'

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容