关于ORM的数据库操作见解
一对多字段增删改查
增
## 方式一 Publish.objects.create(name="东京出版社", addr="东京") Publish.objects.create(name="南京出版社", addr="南京") Publish.objects.create(name="北京出版社", addr="北京") Book.objects.create(title="西游记", price=59.98, publish_id=1) Book.objects.create(title="水浒传", price=69.98, publish_id=1) Book.objects.create(title="红楼梦", price=49.98, publish_id=2) Book.objects.create(title="三国演义", price=59.98, publish_id=3) ## 方式二 book_obj = Book(title="简爱", price=100.00, publish_id=3) book_obj.save()
查
book_obj = Book.objects.filter(pk=1).first() print(book_obj) book_queryset = Book.objects.filter(pk=1) print(book_queryset)
改
## 方式一 Book.objects.filter(pk=1).update(price=20.00) ## 方式二 book_obj = Book.objects.filter(pk=3).first() book_obj.price = 120.99 book_obj.save()
删 级联更新, 级联删除
book_obj = Book.objects.filter(pk=5).delete() print(book_obj) ## 注释 # (1, {'app01.Book_authors': 0, 'app01.Book': 1}) book_author表删除数据0条, book表删除1条数据
多对多增删改查
增 add 不能使用queryset对象
但是支持id,对象,可以一个或多个
book_obj = Book.objects.filter(pk=3).first() author_queryset = Author.objects.filter(pk__gte=2) print(author_queryset) author_obj, author_obj1 = author_queryset print(author_obj,author_obj1) book_obj.authors.add(author_obj,author_obj1)
改
set支持id,对象,queryset(并且可以一个或多个,将原来的数据编程现在的,更改前后都有的数据不变)
book_obj = Book.objects.filter(pk=3).first() author_queryset = Author.objects.filter(pk__gte=2) book_obj.authors.set(author_queryset)
PS:set也可以完成增,他是将多表的所有数据改为现在设置的数据
删
book_obj = models.Book.objects.filter(pk=3).first() book_obj.authors.remove(2)# # book_obj.authors.remove(1,2) author_obj = models.Author.objects.filter(pk=1).first() author_obj1 = models.Author.objects.filter(pk=2).first() book_obj.authors.remove(author_obj) book_obj.authors.remove(author_obj,author_obj1) """ remove() 括号内 既可以传数字也传对象 并且也是支持传多个的 """
PS:remove() 括号内 既可以传数字也传对象 并且也是支持传多个的
清空 清空第三张表中所有和这个对象有关的所有数据
book_obj = models.Book.objects.filter(pk=3).first()# book_obj.authors.clear()
ORM跨表查询 (有连表关系的查询)
正向查询 从关联字段的表出发,查询被关联表单数据 PS:正向查询按照字段 反向查询 从没有关联字段的表出发,查询关联表数据 PS:反向查询按照表名小写
基于对象的子查询
重点
all与set 正向查询时,查询的对象是多表的一方要加all() 反向查询时,查询对象是多表的一方要有小写表名__set.all(),一般连用,
# 1.查询书籍是python入门的出版社名称 book_obj = models.Book.objects.filter(title='python入门').first() # 正向查询按字段 print(book_obj.publish.name) print(book_obj.publish.addr) # 2.查询书籍主键是6的作者姓名 book_obj = models.Book.objects.filter(pk=6).first() print(book_obj.authors) # app01.Author.None print(book_obj.authors.all()) # 3.查询作者是jason的手机号 author_obj = models.Author.objects.filter(name='jason').first() print(author_obj.author_detail.phone) print(author_obj.author_detail.addr) 注意set.all() # 4.查询出版社是东方出版社出版过的书籍 publish_obj = models.Publish.objects.filter(name='东方出版社').first() print(publish_obj.book_set) # app01.Book.None print(publish_obj.book_set.all()) # 5.查询作者是jason写过的所有的书 author_obj = models.Author.objects.filter(name='jason').first() # print(author_obj.book_set) # app01.Book.None print(author_obj.book_set.all()) # 6.查询手机号是110的作者 author_detail_obj = models.AuthorDetail.objects.filter(phone=110).first() print(author_detail_obj.author) print(author_detail_obj.author.name) print(author_detail_obj.author.age)
基于双下划线的连表查询
总结:
有连表关系,就可以用双下划线跳跃的另一张表进行查询 一对一 直接跳到另一张表 一对多 直接跳到另一张表 多对多,直接跳过第三张表,进入对应的表 不管是哪一个查询,都可以一样的查询,并且查询出的都是queryset对象
连表查询中的正向与反向 正向: 外键字段__另一种表的字段 当使用外键字段__时,就已经进入了另一张表了 反向 另一张表名小写__另一张表的字段 当使用外键字段__时,就已经进入了另一张表了
PS:上述内容可以在filter/values中使用
# 1.查询书籍是python入门的出版社名称 # 正向 res = models.Book.objects.filter(title='python入门').values('publish__name') print(res) # 反向 res = models.Publish.objects.filter(book__title='python入门').values('name') print(res) # 2.查询作者是jason的手机号码 # 正向 res1 = models.Author.objects.filter(name='jason').values('author_detail__phone') print(res1) # 反向 res = models.AuthorDetail.objects.filter(author__name='jason').values('phone','author__age') print(res) # 3.查询手机号是120的作者姓名 res2 = models.AuthorDetail.objects.filter(phone=120).values('author__name') print(res2) res = models.Author.objects.filter(author_detail__phone=120).values('name','author_detail__addr') print(res) # 4.查询出版社是东方出版社出版的书籍名称 res = models.Publish.objects.filter(name='东方出版社').values('book__title','addr') print(res) # 5.查询作者是jason的写过的书的名字和价格 res = models.Author.objects.filter(name='jason').values('book__title','book__price') print(res) # 7.查询书籍是python入门的作者的手机号 res = models.Book.objects.filter(title='python入门').values('authors__author_detail__phone') print(res)
相关推荐
技术之博大精深 2020-10-16
jimgreatly 2020-08-03
Lingforme 2020-07-18
chenjiazhu 2020-07-08
Yort 2020-06-28
zry 2020-06-28
技术之博大精深 2020-06-10
Lingforme 2020-06-10
jediaellu 2020-06-02
PengQ 2020-06-01
jediaellu 2020-05-31
Danialzhou 2020-05-30
shawroad 2020-05-30
tlsmile 2020-05-28
jediaellu 2020-05-28