zoukankan      html  css  js  c++  java
  • django学习笔记--数据库中的多表操作

    1.Django数据库----多表的新增操作

    1.一对一模式下新增

    创建一个详情对象,把这个对象赋值给创建的新的user对象

    author_detail = models.AuthorDetail.objects.create(addr='上海',phone='178****4789')
    # 直接设置author_detail为一个对象
    author = models.Author.objects.create(name="zhangsan",age=32,author_detail=author_detail)
    # 直接设置author_detail_id,或者直接设置她的主键为对应的id,author_detail.pk
    author = models.Author.objects.create(name="李四",age=40,author_detail_id=author_detail.pk)
    

    1.1.删除和修改,直接修改更新

    author = models.Author.objects.filter(pk=1).update(author_detail_id=3)
    

    2.一对多的添加

    publish = models.Publish.objects.create(name='上海出版社',addr='上海东方明珠',phone='138****9087',email='***080977**@qq.com')
    book = models.Book.objects.create(name='红楼梦',price=120.00,publish_date='2018-09-10',publish=publish)
    

    3.多对多关系

    # 给书添加两个作者
    book = models.Book.objects.filter(name='红楼梦').first()
    # 拿到数据模型,add可以传对象也可以传id
    book.authors.add(1,3)
    # 删除书的两个作者 
    # clear 移除所有的作者
    book.authors.clear()
    # remove 移除一个对象,可以传对象或者id
    book.authors.remove(3)
    
    # 修改对象
    # 第一种方式  全部删除,在重新添加
    # 第二种方式  set 参数必须是列表,列表内可以传id或者对象
    book.authors.set([7,1])
    

    4.基于对象的跨表查询

    4.1 跨表查询分为正向和反向,

    1.正向---> 关联字段在当前表中,从当前表向外查,叫正向

    2.反向---> 关联字段不在当前表中,从当前表向外查,叫反向

    4.2 一对一查询,正向查询按字段,反向查询按表名小写

    1.正向查询按字段

    2.反向查询按表名小写

    #正向 ,查询name为张三的人的居住地址
    author = models.Author.objects.filter(name='张三').first()
    print(author.author_detail.addr)
    #反向 查询居住地址为上海的人的名称
    author_detail = models.AuthorDetail.objects.filter(addr="上海").first()
    print(author_detail.author.name)
    
    # 查询红楼梦的出版社地址
    book = models.Book.objects.filter(name='红楼梦').first()
    print(book.publish.addr)
    
    
    4.3 一对多查询

    1.正向查询按字段

    2.反向查询按表名小写_set

    #北京出版社出版的所有书籍
    publish = model.Publish.objects.filter(name='北京出版社').first()
    #books获取到的是一个querySet对象
    books = publish.book_set.all()
    
    #查询红楼梦的所有作者
    book = models.Book.objects.filter(name='红楼梦').first()
    authors = book.authors.all()
    
    
    4.4 多对多查询

    1.正向查询按字段

    2.反向查询按表名小写_set

    #查询张三所写的所有书
    author = models.Author.objects.filter(name='张三').first()
    print(author.book.set.all()).first())
    
    

    5.基于对象的跨表查询是子查询,基于双下划线的查询是连表查询

    正向按字段 反向按表名小写,跨表查询,通过一张表获取多个表对应的数据

    #一对一查询 跨表查询
    #查询张三的个人地址
    addr = models.Author.objects.filter(name='张三').values('name','author_detail__addr').first()
    res = models.AuthorDetail.objects.filter(author__name="张三").values('addr',author__name)
    
    
    #查询地址为上海的人的名字 反向查询
    res = models.Author.objects.filter(author_detail__addr='上海').values('name','author_detail_addr').first()
    #正向查询
    res = models.AuthorDetail.objects.filter(addr='上海').values('addr','author__name').first()
    
    
    # 一对多查询
    # 查询红楼梦的出版地址
    res = models.Publish.objects.filter(book__name='红楼梦').values('name','book__name').first()
    
    #查询北京出版社出版的书
    res = models.Book.objects.filter(publish__name='北京出版社').values('name','publish__name').first()
    
    # 多对多查询
    # 跨表查询,Publish  Book  Authors 三张表查询
    # 查询北京出版社出版过的所有书籍的名字以及作者的名字
    # book__ 在book这个表中book__authors在authors表中
    # res = models.Publish.objects.filter(name="北京出版社").values("book__name",'book__authors__name').first()
    # print(res)
    # res = models.Book.objects.filter(publish__name="北京出版社").values('name','authors__name').first()
    # print(res)
    # res = models.Author.objects.filter(book__publish__name="北京出版社").values('name','book__name')
    # print(res)
    

    6.F和Q 聚合查询和分组查询

    引入对应的模块,aggregate聚合函数

    # from django.db.models import  Count,Avg,Max,Min,Sum
    #  获取图书价格的各种信息
    # ret = models.Book.objects.all().aggregate(Avg('price'))
    # ret = models.Book.objects.all().aggregate(Max('price'))
    # ret = models.Book.objects.all().aggregate(Min('price'))
    # ret = models.Book.objects.all().aggregate(Count('price'))
    # ret = models.Book.objects.all().aggregate(Sum('price'))
    
    6.1 F和Q查询

    1.F取出表中字段对应的值

    2.Q查询的时候构成与或非的关系

    在book里面添加评论数和阅读数
    # from django.db.models import F,Q
    # 查询评论数大于阅读数的书
    res = models.Book.objects.filter(commit_num__lt=F('read_num'))
    # 所有评论数加1
    ret = models.Book.objects.all().update(commit_num=F("commit_num")+1)
    
    # Q构造查询关系
    # 查询名字为红楼梦的书并且价格为20的书
    ret = models.Book.objects.filter(name='红楼梦',price=20)
    ret = models.Book.objects.filter(Q(name='红楼梦')&Q(price=20))
    # 查询名字为红楼梦的书或价格为20的书
    ret = models.Book.objects.filter(Q(name='红楼梦')|Q(price=20))
    # 查询名字不等于红楼梦 取非
    ret = models.Book.objects.filter(~Q(name='红楼梦'),price=20.0)
    
  • 相关阅读:
    js事件之event.preventDefault()与event.stopPropagation()用法区别
    [转] The program can't start because api-ms-win-crt-runtime-l1-1-0.dll is missing
    [转] Visual Studio Code behind a proxy
    [转] js == 与 === 的区别
    [转]说说C#的async和await
    [转]Sublime Text3注册码(可用)
    Oracle 12c
    SQL Server死锁
    Initialize the Storage Emulator by Using the Command-Line Tool
    Microsoft Fakes
  • 原文地址:https://www.cnblogs.com/zj901203/p/10967836.html
Copyright © 2011-2022 走看看