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值