zoukankan      html  css  js  c++  java
  • flask系列四之SQLAlchemy(二)表关系

    一、SQLAlchemy外键约束

    1.创建外键约束表结构

    目标:建立两个表“用户表(user)”和“问题表( question)”,其中问题表中的作者id是是用户表的id即外键的关系。(一个用户可以有多个问题)

    Python语句

    (1)用户类

    class User(db.Model):
        __tablename__ = 'user'#用户表
        id=db.Column(db.Integer,primary_key=True, autoincrement=True)
        telephone=db.Column(db.String(11), nullable=False)
        username=db.Column(db.String(50), nullable=False)
        password=db.Column(db.String(100), nullable=False)
        confirmPassword = db.Column(db.String(100), nullable=False)

    (2)问题类

    from datetime import datetime
    class
    Question(db.Model): __tablename__ = 'question'#问题表 id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=False) content = db.Column(db.Text, nullable=False) # now()获取服务器第一次允许的时间 # now 是每次创建一个模型的时候都获取当前的时间 create_time = db.Column(db.DateTime, default=datetime.now) # 定义外键 ---外键指定--使用表名 author_id = db.Column(db.Integer, db.ForeignKey('user.id'))

       #外键依赖--使用模型名称(类名称)
       # backref表达的是:一个author对应多个questions
    author
    = db.relationship('User', backref=db.backref('questions'))
    # 可以使用:authour.questions 得出当前作者的所有问题
    
    

    2.数据库添加用户和问题

    1.要想添加一个问题,因为问题必须依赖用户而存在,所以首先要先添加一个用户并登录成功。

     userObj = User(telephone=‘xxxx’, username='xx', password='xx',confirmPassword='xx')
                    db.session.add(userObj)
                    db.session.commit()

    2.在用户已经登录的的基础上添加一个问题。

    from decorations import login_required
    @app.route('/question/', methods=["GET", "POST"]) @login_required def question(): if request.method == "GET":# 加载页面 return render_template("question.html") else:# 接收表单提交 title = request.form.get("title") content = request.form.get("content") question = Question(title=title, content=content) user_id = session.get("user_id")# user_id:登录用户的id通过session记录 user = User.query.filter(User.id == user_id).first() question.author = user db.session.add(question) db.session.commit() return redirect(url_for('index'))

    注意此处使用装饰器login_required来处理是否登录问题:

    decorations.py中:

    from functools import wraps
    from flask import session,redirect,url_for
    
    # 登录限制装饰器
    def login_required(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            if session.get('user_id'):
                return func(*args, **kwargs)
            else:
                return redirect(url_for("login"))
        return wrapper

    使用装饰器后,若用户没有登录,需要添加问题则会首先跳转到登录页面,登录后才能操作。

    3.查找问题的作者

     question = Question(title=title, content=content)
            user_id = session.get("user_id")
            user = User.query.filter(User.id == user_id).first()
            question.author = user# 问题的作者
            db.session.add(question)
            db.session.commit()

    4.列出某个作者写过的所有问题

    利用反向引用(backref)来,根据作者名字,查找出作者写过的所有文章。

    # 使用的方法
    user = Users.query.filter(Users.username=='xxx').first()
    result = user.questions# 作者添加的所有问题
    for question in result:
       pass

    二、多对多关系讲解

    (1)多对多的关系,需要通过一个中间表进行关联。

    (2)中间表,不能通过class的方式实现,只能通过db.Table的方式实现。

    (4)设置关联:tags = db.relationship('Tag',secondary=article_tag,backref=db.backref('articles'))需要使用一个关键字参数secondary=中间表 来进行关联。

    待续。。。可以参考:http://blog.csdn.net/qq_28877125/article/details/77664575

  • 相关阅读:
    topcoder srm 320 div1
    topcoder srm 325 div1
    topcoder srm 330 div1
    topcoder srm 335 div1
    topcoder srm 340 div1
    topcoder srm 300 div1
    topcoder srm 305 div1
    topcoder srm 310 div1
    topcoder srm 315 div1
    如何统计iOS产品不同渠道的下载量?
  • 原文地址:https://www.cnblogs.com/wfaceboss/p/8477240.html
Copyright © 2011-2022 走看看