又看了模型的建立,想总结一下这三种模型以方便更好的掌握它们
一对多模型
一对多模型就根据下面这个例子理解: (一个用户可以新建多篇博客)
class User(db.Model):
__tablename__='user'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
username=db.Column(db.String(50),nullable=False)
class New(db.Model):
__tablename__='new'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
title=db.Column(db.String(100),nullable=False)
author_id=db.Column(db.Integer,db.ForeignKey('user.id'))
author=db.relationship('User',backref=db.backref('news'))
我觉得一对多模型比较容易理解点,我觉得要注意的点有:
New模型中的author_id 这里要使用外键foreignkey说明你新建这篇博客的用户是谁
New模型中的relationship 用户和发表的博客之间要有一种关系的说明---这里是‘引用User模型并且给 user用户绑定一个news属性’
一对一模型
一对一模型就根据下面这个例子理解:(用户需要存储自己额外信息,比如自己的家庭住址信息;而这种信息只能是一个用户对应一条,所以要使用到一对一模型)
你可以这样:
class User(db.Model):
__tablename__='user'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
username=db.Column(db.String(50),nullable=False)
extend=relationship('UserExtend',uselist=False)
class UserExtend(db.Model):
__tablename__='user_extend'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
school=db.Column(db.String(100),nullable=False)
uid=db.Column(db.Integer,db.ForeignKey('user.id'))
user=relationship('User')
或者这样:
class User(db.Model):
__tablename__='user'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
username=db.Column(db.String(50),nullable=False)
class UserExtend(db.Model):
__tablename__='user_extend'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
school=db.Column(db.String(100),nullable=False)
uid=db.Column(db.Integer,db.ForeignKey('user.id'))
user=relationship('User',backref=db.backref("extend",uselist=False))
我觉得一对一模型要注意的点有:
首先,第一种方法和第二种方法的区别就是第二种看着更简单了。
uselist默认值是False 将默认值改为True 就可以让一个用户只能对应一条信息
第二种方法使用了backref函数 传入了两个参数也可以实现一对一的效果
多对多模型
多对多模型就根据下面这个例子理解:(一篇博客文章下有多个标签,一个标签又可以标记多篇博客文章)
article_tag=Table{
"article_tag",
db.Model.metadata,
db.Column("article_id",db.Integer,db.ForeignKey('article.id'),primary_key=True)
db.Column("tag_id",db.Integer,db.ForeignKey('tag.id'),primary_key=True)
class Article(db.Model):
__tablename__='article'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
title=db.Column(db.String(50),nullable=False)
tags=db.relationship('Tag',backref=db.backref('articles'),secondary=article_tag)
class Tag(db.Model):
__tablename__='tag'
id=db.Column(db.Integer,primary_key=True,autoincrement=True)
name=db.Column(db.String(50),nullable=False)
我觉得多对多模型要注意的点有:
1.首先把要多对多映射的两个模型定义出来
2.多对多模型要相互联系就需要一个中间模型
db.Column("article_id",db.Integer,db.ForeignKey('article.id'),primary_key=True)
db.Column("tag_id",db.Integer,db.ForeignKey('tag.id'),primary_key=True)
3.这两个语句是制作一个复合主键 从而实现多对多
4.relationship建立联系只需要将语句写在两个基本模型中的一个就可以了