zoukankan      html  css  js  c++  java
  • django ORM 连表查询2

    set()

    更新model对象的关联对象

    book_obj=models.Book.objects.first()

    book_obj.authors.set([2,3])

    把book_obj这个对象重新设置关联对象为作者id为2,3的对象

    remove()

    从关联对象中移除被执行的对象

    book_obj=models.Book.objects.first()

    book_obj.authors.remove(3)

    移除这个对象关联的id为3的作者

    clear()

    从关联对象集中移除一切对象。

    book_obj=models.Book.objects.first()

    book_obj.authors.clear()

    注意:对于ForeignKey对象

    clear()和remove()方法仅在null=True时才存在

    class Book(models.Model)

    name = models.CharField(max_length=32)

    publisher=models.ForeignKey(to class.null=True)

    聚合查询:

    aggregate()是QuerySet的一个终止字句,它返回一个包含一些键值对的字典。from django.db.models import Avg, Sum, Max, Min, Countmodels.Book.objects.all().aggregate(Avg("price"))

    是django内置的函数,返回的字典,可以指定key

    models.Book.objects.aggregate(average_price=Avg('price'))

    它的key就是average_price

    也可以一次查询多个

    models.Book.objects.all().aggregate(Avg("price"), Max("price"), Min("price")

    结果为:

    {'price__avg': 13.233333, 'price__max': Decimal('19.90'), 'price__min': Decimal('9.90')}

    分组:

    sql查询:

    select dept.name,AVG(salary) from employee inner join dept on (employee.dept_id=dept.id) group by dept_id;

    orm查询:

    models,Dept.objects.annotate(avg=Avg(''employee__salary'')).values(''name'',''avg'')

    更多实例:

    统计每一本书的作者个数:

    book_list=models.Book.objects.all().annotate(auhor_num=Count("author"))

    for obj in book_list:

    print(obj.author_num)

    找出每个出版社买的最便宜的书的价格

    publisher_list=models.Publisher.objects.annotate(min_price=Min(''book_price''))

    方法2:

    models.Book.objects.values(''publisher__name'').annotate(min_price=Min(''price''))

    统计不止一个作者的图书

    models.Book.objects.annotate(author_num=Count(''author'')).filter(author_num__gt=1))

    根据一本图示作者数量的多少对查询集QuerySet进行排序

    models.Book.objects.annotate(author_num=Count(''author'')).order_by(author_num)

    查询各个作者出的书的总价格

    models.Author.objects.annotate(sum_price=Sum(''book__price'')).value(''name'',''sum_price'')

  • 相关阅读:
    Vue 监听子组件事件
    延时队列
    AES加密
    centos7.9 iftop 工具源码安装
    angular pass get paragrams by router
    Android chrome console in PC
    powershell 运行带路径的exe
    win下 nrm ls报错
    windows10 安装 node 16 解决node-sass node-gyp报错
    位图和布隆过滤器
  • 原文地址:https://www.cnblogs.com/zhaoweihang/p/9210136.html
Copyright © 2011-2022 走看看