• Python


    models.py:

    from django.db import models
    
    
    # 出版社
    class Publisher(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=64, null=False, unique=True)
    
        def __str__(self):
            return "<Publisher object: {}>".format(self.name)
    
    
    # 书籍
    class Book(models.Model):
        id = models.AutoField(primary_key=True)
        title = models.CharField(max_length=64, null=False, unique=True)
        price = models.DecimalField(max_digits=5, decimal_places=2, default=00.00)  # 最长位数为 5,小数位数为 2,默认值为 00.00
        publisher = models.ForeignKey(to="Publisher", null=True)  # 把 null 设置为 True
    
        def __str__(self):
            return "<Book object: {}>".format(self.title)
    
    
    # 作者
    class Author(models.Model):
        id = models.AutoField(primary_key=True)
        name = models.CharField(max_length=16, null=False, unique=True)
        book = models.ManyToManyField(to="Book")  # 多对多关联 Book 表,ORM 会自动生成第 3 张表
    
        def __str__(self):
            return "<Author object: {}>".format(self.name)
    

    book 表:

    修改 price

    聚合查询:

    aggregate():返回一个包含一些键值对的字典。

    键的名称是聚合值的标识符,值是计算出来的聚合值。键的名称是按照字段和聚合函数的名称自动生成出来的。

    orm.py:

    import os
    
    if __name__ == '__main__':
        # 加载 Django 项目的配置信息
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
        # 导入 Django,并启动 Django 项目
        import django
        django.setup()
    
        from app01 import models
    
        # 聚合查询需要导入的函数
        from django.db.models import Avg, Sum, Max, Min, Count
    
        # 计算所有书籍 price 的平均值
        avg_ret = models.Book.objects.all().aggregate(Avg("price"))
        print(avg_ret)
    
        # 计算所有书籍 price 的总和
        sum_ret = models.Book.objects.all().aggregate(Sum("price"))
        print(sum_ret)
    
        # 计算所有书籍 price 的最大值
        max_ret = models.Book.objects.all().aggregate(Max("price"))
        print(max_ret)
    
        # 计算所有书籍 price 的最小值
        min_ret = models.Book.objects.all().aggregate(Min("price"))
        print(min_ret)
    
        # 计算所有书籍 price 的个数
        count_ret = models.Book.objects.all().aggregate(Count("price"))
        print(count_ret)
    

    运行结果:

    生成的是字典类型

    分组:

    orm.py:

    import os
    
    if __name__ == '__main__':
        # 加载 Django 项目的配置信息
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
        # 导入 Django,并启动 Django 项目
        import django
        django.setup()
    
        from app01 import models
    
        from django.db.models import Count
    
        # 查询每一本书的作者个数
        ret = models.Book.objects.all().annotate(author_num=Count("author"))  # 返回的是 book 对象,annotate(author_num) 相当于让 book 对象多了一个 author_num 字段
        print(ret)
        
        for book in ret:
            print("书名:{},作者数:{}".format(book.title, book.author_num))
    

    运行结果:

    这里的 book.annotate(author_num) 相当于让 book 对象多了一个 author_num 字段,但并不是在数据库中多了一个字段

    orm.py:

    import os
    
    if __name__ == '__main__':
        # 加载 Django 项目的配置信息
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
        # 导入 Django,并启动 Django 项目
        import django
        django.setup()
    
        from app01 import models
    
        from django.db.models import Count
    
        # 查询作者数大于 1 的书
        ret = models.Book.objects.all().annotate(author_num=Count("author")).filter(author_num__gt=1)
        print(ret)
    

    运行结果:

    orm.py:

    import os
    
    if __name__ == '__main__':
        # 加载 Django 项目的配置信息
        os.environ.setdefault("DJANGO_SETTINGS_MODULE", "mysite2.settings")
        # 导入 Django,并启动 Django 项目
        import django
        django.setup()
    
        from app01 import models
    
        from django.db.models import Sum
    
        # 查询各个作者出的书的总价格
        ret = models.Author.objects.all().annotate(price_sum=Sum("book__price"))  # 获取所有 author 表数据并添加 price_sum 字段
    
        for i in ret:
            print(i, i.name, i.price_sum)  # 打印所有 author 对象、 author 的 name 字段、price_sum 字段 的数据
    
        # 打印 author 表的所有 id、name、price_sum 字段数据
        print(ret.values_list("id", "name", "price_sum"))
    

    运行结果:

  • 相关阅读:
    查找——图文翔解HashTree(哈希树)
    比較JS合并数组的各种方法及其优劣
    PTA 是否同一棵二叉搜索树(25 分)
    PTA 最大子列和问题(10 分)
    PTA PAT排名汇总(25 分)
    PTA PAT排名汇总(25 分)
    PTA 说反话-加强版(20 分)(字符串处理)
    PTA 说反话-加强版(20 分)(字符串处理)
    Tarjan模版(链式向前星表示方法)
    Tarjan模版(链式向前星表示方法)
  • 原文地址:https://www.cnblogs.com/sch01ar/p/11305200.html
Copyright © 2020-2023  润新知