flask 定义数据关系(多对一)

多对一

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

在例子中,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‘>
 

原文地址:https://www.cnblogs.com/xiaxiaoxu/p/10618343.html

时间: 2024-08-01 06:14:47

flask 定义数据关系(多对一)的相关文章

flask 定义数据库关系(一对一)

一对一 我们将使用国家和首都来演示一对一关系:每个国家只有一个首都.反过来,一个城市也只能作为一个国家的首都.一对一关系如下: 在示例程序中,Country类表示国家,Capital类表示首都.建立一对一关系后,我们将在Country类中创建一个标量关系capital,调用它会获取单个Capital对象,我们还在Capital类中创建一个标量关系属性country,调用它会获取单个的Country对象. 一对一关系实际上是通过建立双向关系的一对多关系的基础上转化而来.我们要确保关系两侧的关系属性

mongoose - 数据关系模型

********************** 作者:  张启卫 时间: 2017年5月23号 功能: mongoDB 与 mongoose 数据关系模型 * 一对一 * 一对多 * 多对多 ********************** 一.嵌入式的(Embed) 1. 添加mongoose模块, 连接数据库 var mongoose = require('mongoose'); mongoose.connect("mongodb://localhost/data_test"); 2.

进程与线程的定义、关系及区别

进程与线程的定义.关系及区别     --参考博客文章:http://blog.csdn.net/yanxiaolx/article/details/51763372 一.进程的定义 进程:指在系统中能独立运行并作为资源分配的基本单位,它是由一组机器指令.数据和堆栈等组成的,是一个能独立运行的活动实体. 进程一般有三个状态:就绪状态.执行状态和等待状态[或称阻塞状态]:进程只能由父进程建立,系统中所有的进程形成一种进程树的层次体系:挂起命令可由进程自己和其他进程发出,但是解除挂起命令只能由其他进

BI之SSAS完整实战教程6 -- 设计维度、细化维度上:创建维度定义特性关系

前面我们使用过数据源向导.数据源视图向导.Cube向导来创建相应的对象. 本篇我们将学习使用维度向导来创建维度. 通过前面几个向导的学习,我们归纳一下共同点,主要分成两步 1. 使用某种对象类型的向导创建对象,完成主要结构搭建 2. 使用相应的设计器完成最终对象的修改和细化 有点像送快递,先通过大的物流(创建对象向导)把货物送到相应的城市,再通过快递员(设计器进行细化)送到具体顾客手中. 同样的,我们使用维度向导以一种通用的方式来创建维度,然后根据自己的业务需求,使用维度设计器将创建的维度放置到

Xilinx VDMA 24位流输出与32位AXI总线的内存 流数据关系

测试方法采用了VDMA仅有MM2S通道, 内存中的图像帧是用MicroBlaze核写入的一个colorbar. VDMA的mhs部分如下, 因为我的输出用了Digilent的HDMI核,而这个HDMI核是32位的,我自己写了个axis_24_32的位宽转换的ip,这个暂且按下不表. BEGIN axi_vdma PARAMETER INSTANCE = axi_vdma_0 PARAMETER HW_VER = 5.04.a PARAMETER C_USE_FSYNC = 0 PARAMETER

优化数据页面(21)——1:1的数据关系

优化数据页面(21)--1:1的数据关系 设计要点:优化数据页面.界面设计.美化exce 秀秀:哎?咱们不能总是纠结于这些小细节吧. 阿金:噢?好像你有什么伟大的设想? 秀秀:比如,数据项之间的关系应该让人一目了然. 阿金:说得对!最起码把基本关系表现出来吧,比如1:1,,1:n,n:n.. 秀秀:嗯.应该让人一眼就能把它们区分出来. 阿金:1:1最好办! 秀秀:怎么"办"? 阿金:因为数据之间是平等的,用列表的方式就行.除了标题行,其它的不用修饰. 表1   数据1:1关系 编号 成

8086定义数据的方法

13 8086中定义数据的方法 <1>db 一个字节 <2>dw 一个字表示两个字节 <3>dd 两个字,表示4个字节 <4>dup 表示数据重复的指令 db N dup(xx) ;//dup表示定义的数据,N表示重复的个数 dw N dup(xx) ;// dup表示定义的数据,N表示重复的个数 dd N dup(xx) ;// dup表示定义的数据,N表示重复的个数 data segment db 1 dw 1 dd 1 data ends 上面这段程序

EF快速开发定义数据接口类(转)

using System; using System.Linq; using System.Linq.Expressions; using System.Data.Objects; namespace HENANLUHENG.Framework.EntityRepository { public interface IRepository<T> where T : class, new() { /// <summary> /// 返回一个 System.Linq.IQueryabl

uml中定义的关系详细详解

uml定义的关系主要有六种:依赖.类属.关联.实现.聚合和组合.下面对其定义和表示方法逐一说明. 依赖(Dependency):元素A的变化会影响元素B,但反之不成立,那么B和A的关系是依赖关系,B依赖A:类属关系和实现关系在语义上讲也 是依赖关系,但由于其有更特殊的用途,所以被单独描述.uml中用带箭头的虚线表示Dependency关系,箭头指向被依赖元素. 类属(Generalization):通常所说的继承(特殊个体 is kind of 一般个体)关系,不必多解释了.uml中用带空心箭头