Django基础五之django模型层(二)多表操作

Django基础五之django模型层(二)多表操作 一 创建模型

表和表之间的关系

    一对一、多对一、多对多

# 作者表 比较常用的信息放在这个表中 class Author(models.Model): name=models.CharField(max_length=32) age=models.IntegerField() authorDetail=models.OneToOneField(to='AuthorDetail') #与AuthorDetail建立一对一的关系,一对一的这个关系字段写在这两个表的任意一个表里面都可以,models.OneToOneField(to='AuthorDetail')就是foreignkey+unique,只不过不需要我们自己来写参数了,并且orm会自动帮你给这个字段名字拼上一个_id,数据库中字段名称为authorDetail_id也可以写成这样# authorDetail = models.OneToOneField(to="AuthorDetail", to_field="id",on_delete=models.CASCADE) on_delete=models.CASCADE级联关系 def __str__(self): return self.name # 作者信息表 不常用的作者信息放这个表中 class AuthorDetail(models.Model): brithday=models.DateField() telephone=models.BigIntegerField() addr=models.CharField(max_length=64) def __str__(self): return self.addr # 书籍出版社表 class Publish(models.Model): name=models.CharField(max_length=32) city=models.CharField(max_length=32) email=models.EmailField() def __str__(self): return self.name # 书籍表 class Book(models.Model): title=models.CharField(max_length=32) publishDate=models.DateField() price=models.DecimalField(max_digits=5,decimal_palces=2) # 与Publish建立一对多的关系,外键字段建立在多的一方,字段publish如果是外键字段,那么它自动是int类型 # foreignkey里面可以加很多的参数,都是需要咱们学习的,慢慢来,to指向表,to_field指向你关联的字段,不写这个,默认会自动关联主键字段,on_delete级联删除字段名称不需要写成publish_id,orm在翻译foreignkey的时候会自动给你这个字段拼上一个_id,这个字段名称在数据库里面就自动变成了publish_id publish=models.Foreignkey(to='publish') # 与Author表建立多对多的关系,ManyToManyField可以建在两个模型中的任意一个,自动创建第三张表,并且注意一点,你查看book表的时候,你看不到这个字段,因为这个字段就是创建第三张表的意思,不是创建字段的意思,所以只能说这个book类里面有authors这个字段属性 authors=models.ManyToManyField(to='Author') def __str__(self): return self.title # 多对多的表关系,我们学mysql的时候是怎么建立的,是不是手动创建一个第三张表,然后写上两个字段,每个字段外键关联到另外两张多对多关系的表,orm的manytomany自动帮我们创建第三张表,两种方式建立关系都可以,以后的学习我们暂时用orm自动创建的第三张表,因为手动创建的第三张表我们进行orm操作的时候,很多关于多对多关系的表之间的orm语句方法无法使用 # 如果你想删除某张表,你只需要将这个表注销掉,然后执行那两个数据库同步指令就可以了,自动就删除了。 #注意不管是一对多还是多对多,写to这个参数的时候,最后后面的值是个字符串,不然你就需要将你要关联的那个表放到这个表的上面 多表间的增删改查 添加表记录---增

​ 操作前先简单的录入一些数据:还是create和save两个方法,和单表的区别就是看看怎么添加关联字段的数据

一对一 方式一: new_author_detail=models.AuthorDetail.objects.create( birthday='1965-10-10', telephone='18335267641', addr='山西大同' ) models.Author.objects.create(, age='53', authorDetail=new_author_detail, ) 方式二 常用 obj=models.AuthorDetail.objects.filter(addr='山西大同').last() print(obj.id) models.Author.objects.create(, age='52', authorDetail_id=obj.id ) 一对多 obj=models.Publish.objects.get(id=3) models.Book.objects.create( title='故事会新编', publishDate='2019-9-10', price=30, # 方式一 publish=obj # 方式二 常用 publish_id=obj.id ) 多对多 方式一 常用 book_obj=models.Book.objects.get(id=1) book_obj.authors.add(*[1,2]) #打散 方式二 author1=models.Author.objects.get(id=3) author2=models.Author.objects.get(id=4) book_obj=models.Book.objects.get(id=4) book_obj.authors.add(*[author1,author2]) 删除表记录---删 一对一 models.AuthorDetail.objects.get(id=6).delete() models.Author.objects.get(id=5).delete() 一对多 models.Publish.objects.get(id=1).delete() models.Book.objects.get(id=1).delete() 多对多 book_obj = models.Book.objects.get(id=1) book_obj.authors.remove(*[1, 2]) #删除 book_obj.authors.clear() #清空 book_obj.authors.add(2,) #添加 book_obj.authors.set(['1','2']) #删除然后更新 更新表记录---改 一对一 models.Author.objects.filter(id=1).update(, age=24, 方式一 # authorDetail_id=5, 方式二 authorDetail=models.AuthorDetail.objects.get(id=3) ) 一对多 models.Book.objects.filter(id=4).update( title='java核心', 方式一 publish_id=4, 方式二 publish=models.Publish.objects.get(id=2) ) 多对多 book_obj.authors.set(['1','2']) #删除然后更新 查询表记录---查 基于对象的跨表查询 -- 类似于子查询

正向查询和反向查询

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyzygx.html