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,这个为关联属性。通过AuthorAuthorDetail表中的内容就要通过这个关联属性。(生成一对一的表,会在关联的表生成字段: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字段。

二 添加记录。

 利用djangoadmin.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.idAuthor表中有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中删除了id2 的记录,则在关联表中和id2(即authorDetail_id=2)的记录也都删除了。(有关联id的那个值没了,这条id值对应的那条记录也没了)

2)一对多 

  3)多对多

多对多删除就是删除第三张表的两者对应关系

  add方法对应。通过类的关联属性增删。

set方法--------》先clear,add

  3.更新

1)一对一

更新方法.update()前必须用filter()查找。不能用get().update()要用queryset对象。 

  2)一对多

  3)多对多

Set方法

  

猜你喜欢

转载自www.cnblogs.com/yq055783/p/12355463.html
今日推荐