博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
12月8日学习内容整理:ORM中的创建多表关系,基于多表关系的插入记录,基于对象的跨表查询...
阅读量:7260 次
发布时间:2019-06-29

本文共 1894 字,大约阅读时间需要 6 分钟。

补充::::

创建类的时候(也就是创建表的时候)没有写主键ID的话ORM会自动创建1个为ID的主键自增字段

浮点型:

models.DecimalField(max_digits=6,decimal_places=2)

6代表数字总位数,2代表小数位数,所以这样设置能表示的最大数字是9999.99

邮件型:

models.EmailField()

对于数据库来说就是一个字符串,但是Django会对email的格式进行校验

 

一、创建多表关系

1、一对多:在 多 的表中创建

关联字段名=models.ForeignKey(被关联的表名,to_field=字段名)

例如:publish=models.ForeignKey("Publish")

》》》ORM会自动给关联字段名加上_id,所以实际上在数据库中存的字段名是publish_id

》》》publish只是ORM层面,是一个对象

》》》to_field代表的是被关联的是哪个字段,不写的话默认是主键ID

 

2、多对多:在两张表中任意一张写就可以

法一:直接在models文件中创建代表关系表的类,给相应的字段做ForeignKey

法二:

字段名=models.ManyToManyField(另一张表名)

例如:authors=models.ManyToManyField("Author")

》》》ORM自动创建第三张表来表示两张表的多对多关系,新的表名是当前表名_字段名,新表的字段名包括自动创建的主键ID,还有两张表名加上_id的两个字段名

》》》在数据库中不会存在当前表的这个字段名,但是在ORM层面是存在的

》》》这个字段名就是被关联的所有model对象集合,即queryset类型,若还没做关联,就是None

 

3、一对一:在两张表中的任意一张表写就行,注意关联的字段必须是unique

字段名=models.OneToOneField(被关联的表名)

author=models.OneToOneField("Author")

》》》ORM会自动把字段名加上_id

 

 

二、基于多表关系插入记录及简单的基于对象的跨表查询

1、一对多关系

方式一:

先要找出被关联的表中对应的model对象

关联字段名(就是上面例子中的publish)=这个model对象,ORM会自动把model对象的主键ID值赋值给数据库中的关联字段名_id

方式二:我们可以直接写 关联字段名_id=某个值,这样也可以进行关联

 

注意注意注意::::

model对象.关联字段名 就是这条记录对应被关联表中的记录对象,如果要取什么字段值直接.字段名就可以,并且只有1个

比如:一本书对应的出版社名称,obj.publish,这本书对应的model对象.类中设置的关联字段名  这样就可以得到这本书对应的出版社记录对象

 

2、多对多关系

要先得到model对象,绑定的和被绑定的,比如我要给某本书绑定多个作者,那么这本书的model对象和几个作者的model对象都要先得到

书的model对象.多对多关系字段名   就是被关联的所有model对象的集合,也就是queryset类型

比如上面举例的authors,书的model对象.authors就是对应这本书作者对象的集合,若还没有做绑定关系就是None

(1)添加绑定关系

》》》方式一:model对象.多对多字段名.add(要绑定的model对象,......)   ORM自动获取被绑定model对象主键ID值添加到数据库中    就比如上面提到的一本书的多个作者的model对象

》》》方式二:.add(*列表)   列表中是一个个要被绑定的model对象

》》》方式三:.add(1,2,3,...)    直接放作者对应的主键ID值

注意::::add方法只是添加而已,没有覆盖的功能

(2)查询绑定的对象

》》》model对象.多对多字段名.all()   就能够取出所有被绑定的model对象,返回的是queryset类型

(3)删除绑定关系

》》》model对象.多对多字段名.remove(被绑定的model对象,......)    ORM自动获取指定的model对象的主键ID值删除掉

(4)清空绑定关系

》》》model对象.多对多字段名.clear()   删除掉所有的绑定关系

 

补充:::_ _str_ _  类的内置方法,作用是当打印对象名时不再返回一个地址,而是返回该方法的return值

 

转载于:https://www.cnblogs.com/wanghl1011/articles/8005977.html

你可能感兴趣的文章
java内部类的定义原则
查看>>
搜索和搜索形式(SEARCHING and its forms)
查看>>
poj 1789 Truck History(最小生成树 prim)
查看>>
maven deploy jar包到远程仓库400
查看>>
python leetcode 1
查看>>
java 之 模板模式(大话设计模式)
查看>>
P1088 火星人
查看>>
C# 单精度转换双精度丢失的问题
查看>>
ubantu 安装杀毒软件 clamav
查看>>
Number Sequence
查看>>
SQL查询字段赋值的case用法
查看>>
Linux文件管理
查看>>
OBIEE + OAS集群配置 Part 1
查看>>
常用符号的英文
查看>>
Dom指针函数
查看>>
linux - 修改时间
查看>>
JS解析XML的实现代码
查看>>
IOS查找PDF
查看>>
【转】WPF [调用线程无法访问此对象,因为另一个线程拥有该对象。] 解决方案以及如何实现字体颜色的渐变...
查看>>
MySQL for Excel —— 用Excel方式操作MySQL
查看>>