relationship里面的lazy属性看得头昏脑涨,还是自己来动手弄点数据熟悉一下
模型还是建立在目前在看的Flask Web这本书上面的数据库,方便测试
第一步,建立一对多关系的测试,class是一这一端,对应student是多那一端,意思是,同一个课程,可以有很多学生选这门课
class Student(db.Model):
__tablename__ = 'students'
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64))
class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))
def __repr__(self):
return '<Student: %r>' %self.name
class Class(db.Model):
__tablename__ = 'classes'
id = db.Column(db.Integer, primary_key=True)
students = db.relationship('Student', backref='_class', lazy="select")
name = db.Column(db.String(64))
def __repr__(self):
return '<Class: %r>' %self.name
注意Class里面的students是relationship,里面的lazy我选择了select,也就是默认值
手动插入数据进数据库,注意Allen和Tina选择的是同一门课,class1.
import sqlite3
conn = sqlite3.connect("e:\\flasky1\data-dev.sqlite")
cur = conn.cursor()
cur.execute("insert into students values(1,'Allen',1)")
cur.execute("insert into students values(2,'Bob',2)")
cur.execute("insert into students values(3,'Tina',1)")
cur.execute("insert into classes values(1,'class1')")
cur.execute("insert into classes values(2,'class2')")
cur.close()
conn.commit()
conn.close()
用c1代表第一门课程,class1,然后通过他的students属性,可以看到有多少学生选了这门课
可以看到,当Class的lazy属性是select的时候,他就是直接查找出了对象,并由对象为元素组成了一个list
然后,用s1这个实例对象,通过Class里面的backref=_class属性,也能访问Class内容,因为backref=_class默认也是select属性,所以,他也是直接导出结果
下面我改成<