ORM多表增删改查
一 创建多表
在models.py里创建4张表:Author(作者)、AuthorDetail(作者详细信息)、Publish(出版社)、Book(书)
四张表关系为:
(1)首先创建一对一关系。OneToOneField()
创建Author表
class Author(models.Model): name=models.CharField( max_length=32) age=models.IntegerField() authorDetail=models.OneToOneField(to="AuthorDetail",to_field="id",on_delete=models.CASCADE)
models.OneToOneField是创建一对一关系的关键字,to="AuthorDetail"表示和AuthorDetail表创建一对一关系。to_field="id"表示关联字段,不写默认为Id(主键)。on_delete=models.CASCADE表示级联删除。(注:to后面的表名和字段都是字符串形式)。创建一对一关系,生成authorDetail,这个为关联属性。通过Author找AuthorDetail表中的内容就要通过这个关联属性。(生成一对一的表,会在关联的表生成字段:authorDetail_id)
(2)创建AuthorDetail表
class AuthorDetail(models.Model): birthday=models.DateField(), telephone=models.CharField(max_length=32) , addr=models.CharField( max_length=64)
(3)然后创建多对一关系。ForeignKey()
外键字段要加在多的一方,即Book表。
Book表和Publish通过ForeignKey连接起来,生成Publishs关联属性。
再建Publish表:
(4)建立多对多关系ManyToManyField
Book表和Author具有多对多关系。可以在任何一张表加。选择在Book表加:
(5)最后生成详细字段关系表
蓝色的只是类里面的关联属性,在表中没有这个字段,只有相应的id字段。
二 添加记录。
利用django的admin.py文件添加记录。
(1)首先在admin.py配置注册字段:
(2)在终端里输入:
Python manage.py createsuperuser创建超级用户
(3)在浏览器输入:http://127.0.0.1:8000/admin/登陆页面,和数据库同步,即可添加数据。
三 在视图函数中增删改查
1.增加
A.一对一
方式一:(常用) 通过id方式
先找到AuthorDetail中的那条记录,并生成obj对象。然后再创建Author记录时,让authorDetail_id=obj.id(Author表中有authorDetail_id字段的)
方式二:
首先创建好一个new_author_detail对象。然后创建Author记录时通过authorDetail等于该对象,就建立两者一对一关系。(不需要再查找一遍了)
B.一对多
方式一:(常用)(id连接)
同一对一增加一样。可以直接把Obj放在等式里。
方式二:(类属性连接)
C多对多
方式一(常用)
直接再Book表(关联表/有关联属性的)找到要添加的那条记录,然后调用Book的关联属性添加到指定的记录。
可以添加多个。方式为*[3,6]。里面的数字是id。
多对多(两张表的记录都已经存在,建立两者对应关系)
方式二:
先找到要添加的对象Book表的和Author表的。然后调用Book表的对象的author属性的add方法,添加Author表的对象。
2.删除
一对一和一对多的删除和单表删除是一样的。但要考虑级联删除。
级联删除原则:
我和你关联,你不能随便删-----------》你删我也删(级联)
我可以随便删,我删了对你没影响
(1)一对一
2是关联表中的内容,直接.deledte找到的记录,对被关联表没有影响。但1中删除了id为2 的记录,则在关联表中和id为2(即authorDetail_id=2)的记录也都删除了。(有关联id的那个值没了,这条id值对应的那条记录也没了)
(2)一对多
(3)多对多
多对多删除就是删除第三张表的两者对应关系
和add方法对应。通过类的关联属性增删。
set方法--------》先clear,再add
3.更新
(1)一对一
更新方法.update()前必须用filter()查找。不能用get().update()要用queryset对象。
(2)一对多
(3)多对多
Set方法