多表增加
# 一对一
#查询要被关联的属相对象
au_obj = models.AuthorDetail.objects.get(id=4)
models.Author.objects.create(
name='海狗',
age=59,
#方式一:直接通过数据库的字段名au_id增加,一对一时,数据必须是没有关联过的,否则会报错
au_id=4,
#方式二:通过属性models类的属性添加,首先要查出要关联的对象,然后通过属性关联,一对一数据必须未关联
au=au_obj,)
#一对多
pub_obj = models.Publish.objects.get(id=3)
models.Book.objects.create(
title='xx2',
price=13,
publishDate='2011-11-12',
#方式一:直接通过数据库的字段名au_id增加,如果关键字为数据库字段名称,那么值为关联数据的值
publishs_id=3,
#方式二:通过属性models类的属性添加, #类属性作为关键字时,值为model对象
publishs=pub_obj,)
#多对多
多对多添加数据是在中间表中添加关联,只能通过属性操作
#查找要关联的作者
ziwen = models.Author.objects.get(id=3)
haigou = models.Author.objects.get(id=5)
new_obj = models.Book.objects.create(
title='海狗产后护理第二部',
price=0.5,
publishDate='2019-09-29',
publishs_id=2,
)
#方式一*:
new_obj.authors.add(3, 5)
#方式二:
new_obj.authors.add(*[3, 5]) # 用的最多,
#方式三:
new_obj.authors.add(ziwen, haigou)
多表删除
#一对一
#删除被关联表的数据,级联删除,会自动删除关联表中的数据,如果没有设置级联删除,就不会删除关联表中的数据
models.AuthorDetail.objects.filter(id=3).delete()
#通过外键表删除,只会删除自己的数据,被关联表中的数据不会删除
models.Author.objects.filter(id=3).delete()
#一对多(和一对一的一样)
models.Publish.objects.filter(id=3).delete()
models.Book.objects.filter(id=4).delete()
#多对多
#多表删除只能通过删除中间表的关联信息,来消除关联,
#获取要消除关联的数据,(书籍)
book_obj = models.Book.objects.get(id=2)
#删除于书籍book_obj相关的作者id为1的作者
book_obj.authors.remove(1) #删除
#清除所有于书籍book_obj相关的关联数据
book_obj.authors.clear() # 清除
#重新设置于书籍book_obj相关的关联作者信息
book_obj.authors.set(['1','5']) # 先清除再添加,相当于修改
多表修改
#orm表中的关联是关联id字段,所以修改字段数据,不会影响关联关系,就是单表修改数据
ret = models.Publish.objects.get(id=2)
models.Book.objects.filter(id=5).update(
#通过属性来修改字段值
title='华丽丽',
publishs=ret,
#通过数据库字段来修改值
publishs_id=1,
)
#多对多修改,是修改中间表的数据,来设置关联关系,通过set设置
#重新设置于书籍book_obj相关的关联作者信息
book_obj.authors.set(['1','5']) # 先清除再添加,相当于修改
多表查询
#一对一查询:
# 关系属性写在表1,关联到表2,那么通过表1的数据去找表2的数据,叫做正向查询,返过来就是反向查询
#正向查询:
obj = models.Author.objects.filter(name='王洋').first()
#正向查询,通过属性查找,会自动查找被关联表中的数据字段,对象.属性
ph = obj.au.telephone
# 反向查询会自动查找关联表中的数据字段,对象.属性对象.小写的表名
obj = models.AuthorDetail.objects.filter(telephone=120).first()
ret = obj.author.name
print(ret)
#一对多:
#正向查询:
obj = models.Book.objects.filter(title='海狗的怂逼人生').first()
ret = obj.publishs.name
#反向查询:
#一堆多的情况下,反向查询是从关联表的数据查找被关联表中的数据,可能是多条数据,
obj = models.Publish.objects.filter(name='24期出版社').first()
#表名后面加__set就是可能查找到多条数据时使用,通过all的方式获取所有查询到的结果
ret = obj.book_set.all() #查询到的是QuerySet对象
#通过foe循环,查看每个结果的字段值
for i in ret:
print(i.title)
#多对多:
#正向查询:建表时的关系属性写在那个表中,通过这个表去查询,就是正向查询
obj = models.Book.objects.filter(title='海狗的怂逼人生').first()
ret = obj.authors.all()
#反向查询:
查询一个作者写了多少书
obj = models.Author.objects.filter(name='海狗').first()
ret = obj.book_set.all()
for i in ret:
print(i.publishs.name)
print(i.title)