sqalhemy的一对多、一对一、多对多模型

又看了模型的建立,想总结一下这三种模型以方便更好的掌握它们

一对多模型

一对多模型就根据下面这个例子理解: (一个用户可以新建多篇博客)

      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建立联系只需要将语句写在两个基本模型中的一个就可以了

猜你喜欢

转载自blog.csdn.net/qq_39497607/article/details/80201442