import os if __name__ == '__main__': os.environ.setdefault("DJANGO_SETTINGS_MODULE", "day82.settings") import django django.setup() from app01 import models # 一对多增加 # publish:可以传一个publish对象 # publish=models.Publish.objects.get(pk=1) # print(publish.name) # # ret=models.Book.objects.create(name='西游记',price=88,publish_date='2018-09-12',publish=publish) # # publish_id 传一个id # ret=models.Book.objects.create(name='三国演义',price=32,publish_date='2018-07-12',publish_id=publish.pk) # print(type(ret.publish)) # # 就是当前图书出版社的对象 # print(ret.publish) # print(type(ret.publish_id)) # print(ret.publish.pk) # print(ret.publish_id) # 一对多修改 # book=models.Book.objects.get(pk=3) # book.publish_id=2 # # book.publish=出版社对象 # book.save() # ret=models.Book.objects.filter(pk=2).update(publish=publish对象) # ret=models.Book.objects.filter(pk=2).update(publish_id=2) # 一对一增加 # authordetail=models.AuthorDatail.objects.create(addr='南京') # # author=models.Author.objects.create(name='恩公',age=17,author_detail=authordetail) # author=models.Author.objects.create(name='小猴',age=16,author_detail_id=authordetail.pk) # 多对多新增 # 给红楼梦这本书添加两个作者(lqz,egon) book = models.Book.objects.get(pk=1) # 相当于拿到了第三张表 # 往第三章表中添加纪录(问题来了?要传对象还是传id),都支持 # book.authors.add(1,2) lqz = models.Author.objects.get(pk=1) egon = models.Author.objects.get(pk=2) # book.authors.add(lqz,egon) # 红楼梦这本书egon这个作者删掉 # book.authors.remove(2) # book.authors.remove(egon,lqz) # book.authors.remove(1,2) # book.authors.remove(*[1,2]) # book.authors.remove(*[lqz,egon]) # 修改红楼梦这本书的作者为lqz和egon # 清空(清空这本的所有作者记录) # book.authors.clear() # book.authors.add(1,2) # book.authors.set(*[6,]) #这样不行 # book.authors.set([6,]) #需要这样传 # lqz=models.Author.objects.get(pk=2) # set 必须传一个可迭代对象 # book.authors.set([lqz,]) #需要这样传 # 一对一查询 # 补充一个概念:正向 反向 # 正向:关联关系在当前表中,从当前表去另一个表 # 反向:关联关系不在当前表,从当前表去另一个表 # 查询lqz作者的地址(正向查询,按字段) # lqz=models.Author.objects.filter(name='lqz').first() # # 作者详情对象 # print(lqz.author_detail.addr) # 查询地址为上海的,作者的名字(反向查询,按表名小写) # authordetail=models.AuthorDatail.objects.filter(addr='上海').first() # 拿到的是作者对象authordetail.author # print(authordetail.author.name) # 一对多 # 查询红楼梦这本书的出版社名字(正向,按字段) # book=models.Book.objects.get(pk=1) # 出版社对象 book.publish # print(book.publish.name) # 查询北京出版社出版的所有书名(反向查询按 表名小写_set.all()) # publish=models.Publish.objects.get(pk=1) # 结果是queryset对象 # books=publish.book_set.all() # for book in books: # print(book.name) # 查询以红开头的 # books=publish.book_set.all().filter(name__startswith='红') # for book in books: # print(book.name) # 多对多 # 红楼梦这本书所有的作者(正向 字段) # book=models.Book.objects.get(pk=1) # # book.authors.all()拿到所有的作者,是一个queryset对象 # authors=book.authors.all() # for author in authors: # print(author.name) # 查询egon写的所有书(反向 表名小写_set.all()) # egon=models.Author.objects.get(pk=2) # 拿到的是queryset对象 # books=egon.book_set.all() # for book in books: # print(book.name) # 基于双下滑线的跨表查询 # 一对一 # 查询lqz作者的名字,地址(正向查询,按字段) # ret=models.Author.objects.filter(name='lqz').values('name','author_detail__addr') # print(ret) # 查询地址为上海的作者的名字(反向,按表名小写) # ret=models.AuthorDatail.objects.filter(addr='上海').values('addr','author__name','author__age') # print(ret.query) # print(ret) # 一对多 # 查询红楼梦这本书的出版社的名字(正向 按字段) # ret=models.Book.objects.filter(name='红楼梦').values('name','publish__name') # print(ret) # 查询北京出版社出版的所有书的名字(反向 按表名小写) # ret=models.Publish.objects.filter(name='北京出版社').values('book__name') # print(ret) # 多对多 # 红楼梦这本书所有的作者名字(正向 按字段) # ret=models.Author.objects.filter(book__name='红楼梦').values('name') # print(ret) # ret=models.Book.objects.filter(name='红楼梦').values('authors__name') # print(ret) # egon出版的所有书的名字(反向 表名小写) # ret=models.Book.objects.filter(authors__name='egon').values('name') # print(ret) # ret=models.Author.objects.filter(name='egon').values('book__name') # print(ret) # 查询北京出版社出版过的所有书籍的名字以及作者的姓名 # ret=models.Publish.objects.filter(name='北京出版社').values('book__name','book__authors__name') # print(ret) # ret=models.Book.objects.filter(publish__name='北京出版社').values('name','authors__name') # print(ret) # ret=models.Author.objects.filter(book__publish__name='北京出版社').values('book__name','name') # print(ret) # 地址是以北开头的作者出版过的所有书籍名称以及出版社名称 # ret = models.AuthorDatail.objects.filter(addr__startswith='北').values('author__book__name', # 'author__book__publish__name') # print(ret) ret = models.Book.objects.filter(authors__author_detail__addr__startswith='北').values('name', 'publish__name') print(ret.query) ret = models.Author.objects.filter(author_detail__addr__startswith='北').values('book__name', 'book__publish__name') print(ret.query)