zoukankan      html  css  js  c++  java
  • django深入-ORM操作

    1 ORM添加

    1.1 一对多添加

      方式一:

    pub_obj=Publish.objects.get(id=2)
    Book.objects.create(title="python",publisher=pub_obj)

      方式二:

    Book.objects.create(title="python",publisher_id=2)

    1.2 多对多添加

    1.2.1 绑定关系

      方式一:

    book_obj=models.Book.objects.create(title="python")
    author1=models.Author.objects.get(name="jack")
    author2=models.Author.objects.get(name="tom")
    book_obj.authors.add(author1,author2) 

      方式二:

    book_obj=models.Book.objects.create(title="python")
    author_list=models.Author.objects.all()
    book_obj.authors.add(*author_list)

    1.2.2 解除关系

    book_obj=models.Book.objects.get(title="python")
    author1=models.Author.objects.get(name="jack")
    book_obj.authors.remove(author1)

      或者解除所有关系

    book_obj.authors.clear()

    2 ORM查询

    2.1 一对多查询

    2.1.1 正向查询

      正向查询按字段,进行查询

    book_obj=models.Book.objects.filter(title="python").first
    pub_name=book_obj.publisher.name # publisher object : 与这本书关联的出版社对象
    pub_addr=book_obj.publisher.addr

    2.1.2 反向查询

      反向查询,按照表名(小写)_set,进行查询

    pub_obj=models.Publish.objects.get(name="机械出版社")
    book_list=pub_obj.book_set.all()  # 与这个出版社关联的所有书籍对象

    2.2 多对多查询

    2.2.1 正向查询

      多对多正向查询,按字段进行查询

    book_obj=models.Book.objects.filter(title="python").first()
    author_list=book_obj.authors.all()

    2.2.2 反向查询

      多对多的反向查询,按关联的表名(小写)_set

    author1=model.Author.objects.get(name="jack")
    book_list=author1.book_set.all()

    2.3 一对一查询

    2.3.1 正向查询

      一对一正向查询,按字段进行查询

    # 查询addr在北京的作者
    authorDetail=models.AuthorDetail.objects.get(addr="bj")
    author_name=authorDetail.author.name

    2.3.2反向查询

      一对一的反向查询,按表名(小写)

    author1=models.Author.objects.get(name="jack")
    addr=author1.authordetail.addr

    2.4 基于双下划线跨表查询

    # 查询python这本书的价格
    ret=models.Book.objects.filter(title="python").values("price","title")
    print(ret) # <QuerySet [{'price': Decimal('122.00')}]>
    
    #查询python这本书的出版社的名称和地址
    # 1.正向查询  按字段    基于book表
    ret=models.Book.objects.filter(title="python").values_list("publisher__name")
    print(ret)
    
    # 2.反向查询 按表名  if 设置了related_name: 按设置值
    ret=models.Publish.objects.filter(bookList__price=333).values_list("name","addr").distinct()
    print(ret)
    
    # 查询人民出版社出版过的所有书籍名称及价格
    ret=models.Book.objects.filter(publisher__name="机械出版社").values("title","price")
    print(ret.count())
    
    ret=models.Publish.objects.filter(name="renmin").values("bookList__title","bookList__price")
    print(ret.count())
     
    
    #查询jack出过的所有书籍的名字(多对多)
    ret=models.Author.objects.filter(name="jack").values_list("book__title")
    print(ret)
    
    ret=models.Book.objects.filter(authors__name__contains="eg").values("title")
    print(ret)
    
    # 地址以沙河开头的的作者出版过的所有书籍名称以及出版社名称
    ret=models.Book.objects.filter(authors__authordetail__addr__startswith="sha").values("title","publisher__name")
    print(ret)

    3 聚合与分组

    3.1 聚合

    from django.db.models import Avg,Count,Sum,Min,Max
    
    # 单纯聚合函数
    # 计算所有图书的平均价格
    ret=models.Book.objects.all().aggregate(priceSum=Sum("price"))
    print(ret)  # {'priceSum': Decimal('2158.00')}

    3.2 分组

    # 统计每一本书的作者个数
    ret=models.Book.objects.all().annotate(authors_num=Count("authors"))  # QuerySet
    print(ret)   # [book_obj1,book_obj2,book_obj3,book_obj4,....]
    
    # 查询每一个出版社出版过的所有书籍的总价格
    #方式1:
    ret3=models.Publish.objects.all().annotate(priceSum=Sum("bookList__price"))
    ret4 = models.Publish.objects.all().annotate(priceSum=Sum("bookList__price")).values("name","priceSum")
    
    # 方式2:
    ret5=models.Book.objects.all().values("publisher__name").annotate(priceSum=Sum("price")).values("publisher__name","priceSum")

    4 F与Q查询

    4.1 F查询

    from django.db.models import F,Q
    ret=models.Book.objects.filter(comment_num__gt=F("read_num")*2)
    models.Book.objects.all().update(price=F("price")+10)

    4.2 Q查询

    from django.db.models import F,Q
    ret=models.Book.objects.filter(comment_num__gt=50,read_num__gt=50)
    ret=models.Book.objects.filter(Q(comment_num__gt=100)|Q(read_num__gt=100))

    5 ORM修改

      1.obj.name="jack"

        obj.save()          # 效率低

      2.表.objects.all().update(name="jack") # 推荐方法

        注意:update方法是QuerySet数据类型的方法

    6 ORM删除

      表.objects.filter(条件).delete()

      注意事项:

        1.delete是QuerySet数据类型的方法

        2.delete是级联删除

  • 相关阅读:
    vue学习笔记之v-if
    vue学习笔记之属性和方法
    vue学习笔记之v-for与-repeat
    王阳明心学
    读《铁血并购》
    心理测试:DISC性格测试(完整版)
    关于旅行
    [转载]win32 计时器使用
    [转]C#中调用资源管理器(Explorer.exe)打开指定文件夹 + 并选中指定文件 + 调用(系统默认的播放类)软件(如WMP)打开(播放歌曲等)文件
    [转]C#读写TEXT文件
  • 原文地址:https://www.cnblogs.com/goodshipeng/p/7887224.html
Copyright © 2011-2022 走看看