美文网首页
Day59 - Flask模型、分页

Day59 - Flask模型、分页

作者: 莫名ypc | 来源:发表于2018-12-19 17:35 被阅读0次

    定义模型

    生成的表明默认为类名

    也可以通过__tablename__ = '表名' 自己定义

    from flask_sqlalchemy import SQLAlchemy
    
    
    db = SQLAlchemy()
    
    
    class Student(db.Model):
        __tablename__ = 'student'  # 默认表名就为student
        id = db.Column(db.Integer, primary_key=True, autoincrement=True)
        s_name = db.Column(db.String(20), unique=True, nullable=False)
        s_phone = db.Column(db.String(11), nullable=True)
        s_age = db.Column(db.Integer, nullable=False)
        s_gender = db.Column(db.Integer, default=1)
    

    迁移方式

    通过函数迁移或者在Terminal使用命令迁移

    python manage.py shell
    >>from ap.models import db
    >>db.create_all() 
    

    添加数据

    db.session.add()
    db.session.commit()

    @blue.route('/add/', methods=['GET', 'POST'])
    def stu_add():
        if request.method == 'GET':
            return render_template('add.html')
    
        if request.method == 'POST':
            # 创建学生信息
            # 1.获取数据
            username = request.form.get('username')
            phone = request.form.get('phone')
            age = request.form.get('age')
            # 2.保存
            stu = Student()
            stu.s_name = username
            stu.s_phone = phone
            stu.s_age = age
            db.session.add(stu)
            db.session.commit()
            return redirect(url_for('app.stu_list'))
    

    查询所有

    Student.query.all()

    查询的结果为列表

    @blue.route('/list/', methods=['GET'])
    def stu_list():
        students = Student.query.all()
        return render_template('list.html', students=students)
    

    修改数据

    通过filter查询到修改对象,filter(Studetn.id == id),查询结果为类表

    通过Student.query.filter(Student.id == id).first()获取到查询对象

    db.session.add(stu)可以写也可以省略

    db.session.commit()

    @blue.route('/edit/<int:id>/', methods=['GET', 'POST'])
    def stu_edit(id):
        if request.method == 'GET':
            stu = Student.query.filter(Student.id == id).first()
            return render_template('add.html', stu=stu)
        if request.method == 'POST':
            # 1.获取页面中的参数
            username = request.form.get('username')
            age = request.form.get('age')
            phone = request.form.get('phone')
            # 2.获取对象
            stu = Student.query.filter(Student.id == id).first()
            # 3.修改属性
            stu.s_name = username
            stu.s_phone = phone
            stu.s_age = age
            db.session.add(stu)
            db.session.commit()
            return redirect(url_for('app.stu_list'))
    

    删除数据

    db.session.delete(对象)

    db.session.commit()

    @blue.route('/del/<int:id>/', methods=['GET', 'POST'])
    def stu_del(id):
        if request.method == 'GET':
            # 获取删除对象
            stu = Student.query.filter(Student.id == id).first()
            # 使用delete(对象)
            db.session.delete(stu)
            db.session.commit()
            return redirect(url_for('app.stu_list'))
    

    批量添加

    db.session.add_all(对象)

    db.session.commit()

    @blue.route('/add_all/', methods=['GET'])
    def add_all():
        stus = []
        for i in range(10):
            stu = Student()
            stu.s_age = random.randint(18, 28)
            stu.s_name = '小明%s' % random.randint(0, 10000)
            stu.s_phone = '12345678910'
            stus.append(stu)
            # db.session.add(stu)
        db.session.add_all(stus)
        db.session.commit()
        return '创建成功'
    

    查询

    query.filter(模型.字段 == 值)

    query.filter_by(字段=值)

    query.get(主键值)

    • 查询所有数据
      query.all( ) - 结果为列表

    • 排序:升序
      order_by(条件) 或者 asc

    • 降序
      order_by(-条件) 或者 desc

    • 实现分页
      offset和limit
    stus = Student.query.offset(0).limit(2)
    
    • 模糊查询contains
    stus = Student.query.filter(Student.s_name.contains('小明')).all()
    
    • 以小开头的学生信息
      startwith
        stus = Student.query.filter(Student.s_name.startswith('小')).all()
    
    • 以3结尾的学生信息
      endwith
        stus = Student.query.filter(Student.s_name.endswith('3')).all()
    
    • 第四位为‘明'的学生信息
      占位符_, 通配符%
        stus = Student.query.filter(Student.s_name.like('___明%')).all()
    
    • 查询id为1,2,3,4,5的学生信息
      in_
        stus = Student.query.filter(Student.id.in_([1, 2, 3, 4, 5]))
    
    • 年龄:查询年龄小于21的信息
      gt - 大于
      ge - 大于等于
      lt - 小于
      le - 小于等于
      也可以直接写>、<、=、>=、<=
        stus = Student.query.filter(Student.s_age.__le__(21)).all()
        stus = Student.query.filter(Student.s_age <= 21).all()
    
    • 查询年龄小于22,且姓名以6结束
    suts = Student.query.filter(Student.s_age < 22).filter(Student.s_name.endswith('6')).all()
    suts = Student.query.filter(Student.s_age < 22, Student.s_name.endswith('6')).all()
    
    • and_ 、 or_ 、 not_
    from sqlalchemy import and_, not_, or_
    
    suts = Student.query.filter(and_(Student.s_age < 22, Student.s_name.endswith('6'))).all()
    
    suts = Student.query.filter(or_(Student.s_age < 22, Student.s_name.endswith('6'))).all()
    
    suts = Student.query.filter(not_(Student.s_age == 22)).all()
    

    分页

    • has_prev - 是否有上一页
    • has_next - 是否有下一页
    • prev_num - 上一页页码
    • next_num - 下一页页码
    • paginate.page - 当前页
    • paginate.pages - 总页数
    • paginate.total - 数据条数
    • paginate.iter_pages() - for循环获取页码
    @blue.route('/list/', methods=['GET'])
    def stu_list():
        # students = Student.query.all()
        page = int(request.args.get('page', 1))
        paginate = Student.query.paginate(page=page, per_page=5)
        students = paginate.items
        return render_template('list.html', students=students, paginate=paginate)
    

    list.html

    {% extends 'base.html' %}
    
    {% block title %}
        学生列表
    {% endblock %}
    
    {% block content %}
        <p><a href="{{ url_for('app.stu_add') }}">添加学生信息</a></p>
    
        <p>学生信息</p>
        <table>
            <thead>
                <th>id</th>
                <th>姓名</th>
                <th>年龄</th>
                <th>电话</th>
                <th>操作</th>
            </thead>
            <tbody>
                {% for stu in students %}
                    <tr>
                        <td>{{ stu.id }}</td>
                        <td>{{ stu.s_name }}</td>
                        <td>{{ stu.s_age }}</td>
                        <td>{{ stu.s_phone }}</td>
                        <td>
                            <a href="{{ url_for('app.stu_edit', id=stu.id) }}">修改</a>
                             |
                            <a href="{{ url_for('app.stu_del', id=stu.id) }}">删除</a>
                        </td>
                    </tr>
                {% endfor %}
            </tbody>
        </table>
    
        {% if paginate.has_prev %}
            <a href="{{ url_for('app.stu_list') }}?page={{ paginate.prev_num }}">上一页</a>
        {% else %}
            <a href="#">上一页</a>
        {% endif %}
    
        {% for i in paginate.iter_pages() %}
            <a href="{{ url_for('app.stu_list')}}?page={{ i }}">{{ i }}</a>
        {% endfor %}
    
        {% if paginate.has_next %}
            <a href="{{ url_for('app.stu_list') }}?page={{ paginate.next_num }}">下一页</a>
        {% else %}
            <a href="#">下一页</a>
        {% endif %}
    
        当前{{ paginate.page }}页, 共{{ paginate.pages }}页, 一共{{ paginate.total }}条数据
    {% endblock %}
    

    相关文章

      网友评论

          本文标题:Day59 - Flask模型、分页

          本文链接:https://www.haomeiwen.com/subject/euydkqtx.html