flask定义数据关系(多对一)(代码片段)

xiaxiaoxu xiaxiaoxu     2022-12-03     505

关键词:

多对一

一对多关系反过来就是多对一关系,这两种关系模式分别从不同的视角出发。一个作者拥有多篇文章,反过来就是多篇文章属于同一个作者。为了便于区分,我们使用居民和城市来演示多对一关系:多个居民住在同一个城市。多对一关系如下:

 技术图片

 

在例子中,Citizen类表示居民,City类表示城市。建立多对一关系后,我们将在Citizen类中创建一个标量关系属性city,调用它可以获取单个City对象。

我们在前面介绍过,关系属性在关系模式的出发侧定义。当出发点在“多”这一侧时,我们希望在Citizen类中添加一个关系属性city来获取对应的城市对象,因为这个关系属性返回单个值,我们称之为标量关系属性。在定义关系时,外键总是在“多”这一侧定义,所以在多对一关系中外键和关系属性都定义在“多”这一侧,即City类中:

app.py:建立多对一关系

 

class Citizen(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(70), unique = True)
    city_id = db.Column(db.Integer, db.ForeignKey(city.id))
    city = db.relationship(City)

class City(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(30), unique = True)

 

这时定义的 city关系属性是一个标量关系(返回单一数据)。当Citizen.city被调用时,SQLAlchemy会根据外键字段city_id存储的值查找对应的City对象并返回,即居民记录对应的城市记录。

>>> from app import Citizen
>>> from app import db
>>> city1 = City(name = DaLian)
>>> citizen1 = Citizen(name = Xia)
>>> citizen1.city= city1
>>> citizen1.city
<City (transient 54277680)>

 

当建立双向关系时,如果不使用backref,那么一对多和多对一关系模式在定义上完全相同,这时可以将一对多和多对一关系模式。我们通常都会为一对多或多对一建立双向关系,这时将弱化这两种关系的区别,一律称为一对多关系。

class Citizen(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(70), unique = True)
    city_id = db.Column(db.Integer, db.ForeignKey(city.id))
    city = db.relationship(City, back_populates=citizen)

    def __repr__(self):
        return <Citizen %r> % self.name

class City(db.Model):
    id = db.Column(db.Integer, primary_key = True)
    name = db.Column(db.String(30), unique = True)
    #back_populates的值为另一侧的关系属性名
    #relationship函数的第一个参数是另一侧的模型名(类型)
    citizen = db.relationship(Citizen, back_populates=city)


>>> from app import Citizen, City, db
>>> city1 = City(name = DaLian)
>>> citizen1 = Citizen(name = xiaxiaoxu)
>>> citizen2 = Citizen(name = xufengchai)
>>> citizen1.city = city1
>>> citizen2.city = city1
>>> city1.citizen
[<Citizen xiaxiaoxu>, <Citizen xufengchai>]
>>> citizen2.city
<City DaLian>
>>> citizen1.city
<City DaLian>

 

 

flask中一对一,一对多以及多对多关系的设定(代码片段)

一对多关系:classGrade(db.Model):id=db.Column(db.Integer,primary_key=True)name=db.Column(db.String(20),nullable=False)num=db.Column(db.Integer,default=0)time=db.Column(db.String(20),default=‘2018-01-01‘)stu 查看详情

resultmap自定义映射(多对一)(代码片段)

自定义resultMap,处理复杂的表关系,实现高级结果集映射  1) id:用于完成主键值的映射  2) result:用于完成普通列的映射  3) association:一个复杂的类型关联;许多结果将包成这种类型  4) collection:复杂... 查看详情

flask框架从入门到精通之模型关系(十七)(代码片段)

知识点:1、模型关系参照一、概况在数据库中,我们知道数据关系大概有如下几种:一对一、一对多、多对多、自关联等。我们模型已经描述过了一对多,那么下面我们在用模型把其它关系也写出来。关系一对一... 查看详情

flask框架从入门到精通之模型关系(十七)(代码片段)

知识点:1、模型关系参照一、概况在数据库中,我们知道数据关系大概有如下几种:一对一、一对多、多对多、自关联等。我们模型已经描述过了一对多,那么下面我们在用模型把其它关系也写出来。关系一对一... 查看详情

flask学习-77.flask-sqlalchemy一对一关系增删改查(代码片段)

前言SQLAlchemy连接到关系型数据库,关系型数据最擅长的东西就是关系。一对一模型设计有个Student记录学生基本信息,Contact表记录学生联系方式,Student和Contact是一对一关系。classStudent(db.Model):__tablename__='student&#... 查看详情

resultmap自定义映射(多对一)(代码片段)

自定义resultMap,处理复杂的表关系,实现高级结果集映射  1) id:用于完成主键值的映射  2) result:用于完成普通列的映射  3) association:一个复杂的类型关联;许多结果将包成这种类型  4) collection:复杂... 查看详情

26.django实现表关系(一对多,一对一,多对多))(代码片段)

表关系的实现:实践实现:(1)模型的定义:(models.py文件)fromdjango.dbimportmodels#Createyourmodelshere.classDepartment(models.Model):"""学院表"""d_id 查看详情

26.django实现表关系(一对多,一对一,多对多))(代码片段)

表关系的实现:实践实现:(1)模型的定义:(models.py文件)fromdjango.dbimportmodels#Createyourmodelshere.classDepartment(models.Model):"""学院表"""d_id 查看详情

flask数据库多对多关系

 数据库使用关系建立记录之间的联系。其中,一对多关系是最常用的关系类型,它把一个记录和一组相关的记录联系在一起。实现这种关系时,要在“多”这一侧加入一个外键,指向“一”这一侧联接的记录。大部分的其他... 查看详情

gorm关系一对一,一对多,多对多查询(代码片段)

...章属于一个分类.文章有多个标签相关表四张。表提前在数据库建立的。没有外键关系article表tag表.article_tag表category表//文章表typeArticlestructIdint`json:"id"`Titlestring`json:"title"`CategoryIdint`json:"category_ 查看详情

27.一对一,一对多,多对多关系表的各种骚操作(代码片段)

1.关系表的数据操作(1)一对多表关系的数据的添加修改①学院表信息的插入:常规方法是写个视图函数,在视图函数里添加插入数据的逻辑代码。但是这样的话——你得访问此视图函数对应的接口才能添加成功&... 查看详情

27.一对一,一对多,多对多关系表的各种骚操作(代码片段)

1.关系表的数据操作(1)一对多表关系的数据的添加修改①学院表信息的插入:常规方法是写个视图函数,在视图函数里添加插入数据的逻辑代码。但是这样的话——你得访问此视图函数对应的接口才能添加成功&... 查看详情

gorm关系一对一,一对多,多对多查询(代码片段)

gorm关系一对一,一对多,多对多查询gormv2版本BelongsTomysql表CREATETABLE`user`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(64)NOTNULLDEFAULT\'\',`c_sn`int(11)NOTNULLDEFAULT\'0\',`created_at`datetime(3)DEFAULTNULL,`up 查看详情

hibernate单向多对一映射关系

...域模型:从Order到Customer的多对一单向关联需要在Order类中定义一个Customer属性,而在Customer类中无需定义存放Order对象的集合属性关系数据模型:ORDERS表中的CUSTOMER_ID参照CUSTOMER表的主键               Order... 查看详情

7-外键的变种三种关系(代码片段)

...,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系#一对一:如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign... 查看详情

0914表与表之间的关系补充一对一关系记录操作关键字多对多子查询(代码片段)

1表与表之间联系之一对一关系补充  生活中的一对一   客户表,学员表     通过分析一个客户只对应一个学员一个学员只对应一个客户所以确定关系为一对一在mysql中通过外键来建立一对一createtablecustomer(idintpr... 查看详情

10-外键的变种三种关系(代码片段)

...,则证明这两张表时一个双向的多对一,即多对多,需要定义一个这两张表的关系表来专门存放二者的关系#一对一:如果1和2都不成立,而是左表的一条记录唯一对应右表的一条记录,反之亦然。这种情况很简单,就是在左表foreign... 查看详情

自定义多对一经理

】自定义多对一经理【英文标题】:Custommanytoonemanageronself【发布时间】:2017-01-0921:00:06【问题描述】:我正在尝试在我的模型上使用自定义管理器,但希望它也用于自我关系中,因此我可以向add方法添加一些代码。代码如下:fr... 查看详情