如果 values() 子句在 annotate() 之前,就会根据 values() 子句产生的分组来计算注解。
    然而如果 annotate() 子句在 values() 之前,就会根据整个查询集生成注解。这种情况下,values() 子句只能限制输出的字段。

    计算所有的项目中引入名字是poi的组件,版本与数量分布情况

    1. Component.objects.filter(name='poi').\
    2. values('version').\
    3. annotate(software_count=Count('sboms__software',
    4. distinct=True))

    输出

    1. <QuerySet [
    2. {'version': '3.10', 'software_count': 1},
    3. {'version': '3.8', 'software_count': 7},
    4. {'version': '3.9', 'software_count': 2}]>

    查看上面语句实际执行的SQL语句

    1. print(Component.objects.filter(name='poi').\
    2. values('version').\
    3. annotate(software_count=Count('sboms__software', distinct=True)).\
    4. query)
    1. SELECT
    2. ` sbom_manager_component `.` version `,
    3. COUNT(DISTINCT ` sbom_manager_sbom `.` software_id `) AS ` software_count `
    4. FROM
    5. ` sbom_manager_component `
    6. LEFT OUTER JOIN ` sbom_manager_sbom_components ` ON (
    7. ` sbom_manager_component `.` id ` = ` sbom_manager_sbom_components `.` component_id `
    8. )
    9. LEFT OUTER JOIN ` sbom_manager_sbom ` ON (
    10. ` sbom_manager_sbom_components `.` sbom_id ` = ` sbom_manager_sbom `.` id `
    11. )
    12. WHERE
    13. ` sbom_manager_component `.` name ` = poi
    14. GROUP BY
    15. ` sbom_manager_component `.` version `
    16. ORDER BY
    17. NULL
    1. Component.objects.all().aggregate(Avg('pk'))

    实际执行的SQL语句

    1. SELECT
    2. AVG(` sbom_manager_component `.` id `) AS ` pk__avg `
    3. FROM
    4. ` sbom_manager_component `

    查看每个组件,对应的SBOM的数量

    1. Component.objects.annotate(Count('sboms'))
    1. SELECT
    2. ` sbom_manager_component `.` id `,
    3. ` sbom_manager_component `.` name `,
    4. ` sbom_manager_component `.` vendor `,
    5. ` sbom_manager_component `.` version `,
    6. ` sbom_manager_component `.` type `,
    7. COUNT(` sbom_manager_sbom_components `.` sbom_id `) AS ` sboms__count `
    8. FROM
    9. ` sbom_manager_component `
    10. LEFT OUTER JOIN ` sbom_manager_sbom_components ` ON (
    11. ` sbom_manager_component `.` id ` = ` sbom_manager_sbom_components `.` component_id `
    12. )
    13. GROUP BY
    14. ` sbom_manager_component `.` id `
    15. ORDER BY
    16. NULL

    使用 values() 子句来对结果集进行约束