Python Flask框架学习笔记14
Posted CCH2023
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python Flask框架学习笔记14相关的知识,希望对你有一定的参考价值。
数据库一对一的关系:
实现一对一的关系,只需要在一对多的基础上,将“多”的那一端设置为“一”即可。
书上举得例子是:用户拓展表。
在公司业务增长的情况下,需要存储用户的许多属性,但是有些属性是不常用的,为了提高网站的响应速度,我们把不常用的属性放到拓展表中,只有需要的时候才访问。那么这个例子就是一对一的关系。一个用户只有一个拓展数据,一个拓展数据只能属于一个用户。
class User(db.Model):
__tablename__ = 'user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
password = db.Column(db.String(100), nullable=False)
extension = db.relationship("UserExtension", back_populates="user", uselist=False)
class UserExtension(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
school = db.Column(db.String(100))
user_id = db.Column(db.Integer, db.ForeignKey("user.id"), unique=True)
user = db.relationship("User", back_populates="extension")
代码说明:
1)该例子中,UserExtension类中,没有表__tablename__的配置项。
2)user_id 通过db.ForeignKey引用了之前创建表的user的id字段。
3)db.relationship来引用外键所指向的那个ORM模型。
4)双方都能通过属性直接访问到对方。
5)其中增加了配置:unique=True, uselist=False。就是一对一。
在看多对多的关系:
多对多的关系在数据库层面是需要一张中间表来表现的。
比较典型的例子是:文章和标签:一篇文章可以添加多个标签,一个标签可以被多篇文档添加。
article_tag_table = db.Table(
"article_tag_table",
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(200),nullable=False)
content = db.Column(db.Text,nullable=False)
author_id = db.Column(db.Integer,db.ForeignKey("user.id"))
author = db.relationship("User",backref="articles")
tags = db.relationship("Tag",secondary=article_tag_table,back_populates="articles")
class Tag(db.Model):
__tablename__ = "tag"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(100))
articles = db.relationship("Article",secondary=article_tag_table,back_populates="tags")
@app.route('/many2many')
def many2many():
article1 = Article(title="11",content="aa")
article2 = Article(title="22", content="bb")
tag1 = Tag(name="python")
tag2 = Tag(name="flask")
article1.tags.append(tag1)
article1.tags.append(tag2)
article2.tags.append(tag1)
article2.tags.append(tag2)
db.session.add_all([article1,article2])
db.session.commit()
return "多对多数据添加成功!"
在这个过程中,还遇到了这个问题;
把数据库中的表都进行了删除,发现是正常的了。
级联操作:
级联操作的概念:
在操作某个对象的时候,相关联的对象也会进行对应的操作。
在数据库层面的级联操作包括级联删除、级联更新等。
那有时间,可以把这个地方,做专门一个主题进行学习。
[ Flask ] 轻量级Python Web框架 学习笔记
点击 阅读原文 查看笔记
以上是关于Python Flask框架学习笔记14的主要内容,如果未能解决你的问题,请参考以下文章