今日总结:
多表的增删改查操作
多表操作
增
book
id title book_detail publish author
onetoone manytoone manytomany
book_obj = models.Book.objects.create(
title='xx',
#book_detail_id = 1,
book_detail = BookDetail(),
)
book_obj.author.add(*[1,2])
删
book_obj = models.Book.objects.filter(id=2)[0]
book_obj.author.clear()
book_obj.author.remove(*[1,2])
book_obj.author.set([1,2])
models.Book.objects.filter(id=2).delete()
改
models.Book.objects.filter(id=2).update(
publish_id = 2,
)
book_obj = models.Book.objects.filter(id=2)[0]
book_obj.author.set([1,2])
查
一对多的基于对象的正反向查询:
查询主键为1的书籍的出版社所在的城市
models.Book.objects.filter(id=1)[0].publish.addr
models.Publish.objects.get(name='18期出版社').book_set.values('title')
一对一的基于对象的正反向查询:
查询一下骚小强的电话
正向
models.Author.objects.get(name='骚小强').au.tel
反向
models.AuthorDetail.objects.get(tel='222').author.name
多对多的基于对象的正反向查询:
水浒传这本书有几个作者参与撰写了
正向:
models.Book.objects.get(title='水浒传').authors.values('name')
反向:
models.Author.objects.get(name='骚小强').book_set.values('title')
一对多的基于双下划线的正反向查询:
查询主键为1的书籍的出版社所在的城市
models.Book.objects.filter(id=1).values('publish__addr')
models.publish.objects.filter(book__id=1).values('addr')
一对一的基于双下划线的正反向查询:
查询一下骚小强的电话
models.Author.objects.filter(name='骚小强').values('au__tel')
models.AuthorDetail.objects.filter(author__name='骚小强').values('tel')
多对多的基于双下划线的正反向查询:
水浒传这本书有几个作者参与撰写了
models.Book.objects.filter(title='水浒传').values('authors__name')
models.Author.objects.filter(book__title='水浒传').values('name')
聚合查询:aggragate()
models.Book.objects.all().aggragate(Avg('price'))
分组: annotate() group by
models.Author.objects.values('id','name').annotate(c=Count('book__id'))
models.Author.objects.filter(Q(age__gt=20)&Q(id__gt=20),name='xxx').annotate(c=Count('book__id')).values('name','c');
1.一对一关系
models.onetoonefield(to=要关联的表名,to_field='关联的字段')
2.一对多关系
models.foreignkey(to='要关联的表名',to_field='要关联的字段')
注意:一对一和一对多关系删除时要注意,设置里foreignkey后,要设置级联删除' on_delete=models.CASCADE '
3.多对多关系
models.manytomanyfield('to'='要关联的表名')
增加:
pub_obj=models.publish.objects.fillter(id=n)[0]
多对一插入数据方式1:
models.book.objects.create(
title='水浒传',
publisher=pub_obj,
)
多对一插入数据方式2:
models.book.objects.create(
title='三国演义',
publish_id=1,
)
一对一插入数据方式:
models.book.objects.create(
...,
...,
)
多对多插入数据方式 : 文字描述(首先你要先找到一个具体的对象,然后用这个对象去点那个你要关联的表名,然后点add()把你要插入的东西插入进去 )
方式一
#首先先找到一个具体的对象
book_obj=models.book.objects.get(id=1)
#
hh_obj=models.book.objects.get(id=xxx)
#添加数据
book_obj.关联的那个表名.add(hh_obj)
方式二
book_obj.表名.add(*[1,2])
book_obj.表名.add(1,2)
一对一
正向查询: 对象.另一个表名.字段名
反向查询: 对象.另一个表名.字段名
一对多
正向查询: 对象.另一个表的表名.字段名
反向查询: 对象.另一个表的表名_set.all().values(id=xx)
多对多
正向查询: 对象.另一个表的表名.all()
反向查询: 对象.另一个表的表秒_set.all()