12月8日学习内容整理:ORM中的创建多表关系,基于多表关系的插入记录,基于对象的跨表查询

补充::::

创建类的时候(也就是创建表的时候)没有写主键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值

 

posted @ 2017-12-08 16:24  九二零  阅读(80)  评论(0编辑  收藏  举报