5

したがって、多くのカテゴリに表示される一連のタスクがあります。

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)

ご覧のとおり、各タスクは複数のタスク グループに表示できます。

クエリで次の条件を満たす必要があります。

  1. すべての TaskGroup のリストが返されます。
  2. 特定のグループ内のタスク数のカウント。伊江家具(3)、寝具(2)、フロアランプ(6)
  3. 特定の TaskGroup にタスクがない場合、そのグループには 0 が必要です
  4. 各グループ内のタスクは、現在のユーザーによって制限されています。

これまでに思いついた最高のものは、次のようなものです。

TaskGroup.objects.filter(
    task__assignee=current_usr
).annotate(
    task_count=Count('task__id')
).order_by('name')

しかし、カウントを行う前にすべてをフィルタリングするため、タスクがゼロのタスク グループは表示されません。

多分私は非常に考えているかもしれませんが、私は何年もの間これをやろうとしてきました.この段階では、ループして自分で数えたいと思っています.

私の残り少ない正気を救う手助けができることを本当に願っています!

4

1 に答える 1

0

私はかつてまったく同じ問題を抱えていました。1 つの解決策は、追加のサブクエリを使用することです。

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')

またはそのようなもの。結合キーが間違っている可能性があります。

しかし、これはただ醜いです。多くの DRY および DB の独立性の原則を破っています。

より良いオプションは、おそらく 2 つのクエリを使用することです。そのユーザーにタスクが割り当てられていない特定のグループの 2 つ目:

empty_groups = TaskGroup.objects.exclude(task__assignee=current_usr)

次に、1 つだけではなく 2 つのセットを反復処理します。

于 2011-06-22T23:31:31.487 に答える