sql - Django ORM中多对多字段的复杂计数

标签 sql django django-models django-aggregation

所以我有一组可以出现在许多类别中的任务:

class TaskGroup(models.Model):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=200)
    icon = models.CharField(max_length=200, blank=True, null=True)

    def __unicode__(self):
        return unicode(self.name)


class Task(models.Model):
    start_date = models.DateField()
    end_date = models.DateField()
    is_date_fuzzy = models.BooleanField()
    name = models.CharField(max_length=200)
    assignee = models.ForeignKey(User, verbose_name="users who is assigned the task", blank=True, null=True)
    task_groups = models.ManyToManyField(TaskGroup)

如您所见,每个任务都可以出现在多个任务组中。

我希望我的查询满足以下条件:
  • 所有任务组的列表应该是
    回来。
  • 任务数量的计数
    特定组内。 IE。
    家具 (3)、床上用品 (2)、地板
    灯 (6)
  • 如果没有任务
    特定任务组,表示组
    应该有 0
  • 每个组内的任务是
    受限于当前用户。

  • 到目前为止,我想出的最好的东西是这样的:
    TaskGroup.objects.filter(
        task__assignee=current_usr
    ).annotate(
        task_count=Count('task__id')
    ).order_by('name')
    

    但是它在进行计数之前过滤了所有内容,因此我看不到具有零任务的任务组。

    也许我很想,但我多年来一直在尝试这样做,而我在这个阶段只是想循环并自己计算。

    我真的希望你能帮助我挽救我的一点点理智!

    最佳答案

    我曾经遇到过完全相同的问题。一种解决方案是使用额外的子查询:

    TaskGroup.objects.extra(
        select={"task_count": "SELECT COUNT(*) from app_task where app_task.id=app_taskgroup.task_id AND app_task.assignee = '?'"},
        select_params = [current_usr]
    ).order_by('name')
    

    或类似的东西。可能加入 key 是错误的。

    但这只是丑陋。并打破了许多 DRY 和 DB 独立性原则。

    更好的选择可能是使用 2 个查询。没有分配给该用户的任何任务的特定组的第二个:
    empty_groups = TaskGroup.objects.exclude(task__assignee=current_usr)
    

    然后只需迭代两组而不是一组。

    关于sql - Django ORM中多对多字段的复杂计数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6447503/

    相关文章:

    python - Django - 一次测试多个 View

    python - Django:durationField 默认值

    C# 自动模式比较 SQL 数据库列表和更新

    sql - Linux SQL 服务器 Windows SSMS 连接

    python - django读取文件以导入详细信息

    python - CommandError : Can't find xgettext. 与 django i18n

    python - 在 Django 模型中指定 mySQL ENUM

    python - Django 模型对象过滤相对于日期范围来查找创建对象的初始日期?

    php - 如何寻找更高的值(value)

    sql - CAST as NVarChar 时删除尾随 0