pip*_*pip 5 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)
Run Code Online (Sandbox Code Playgroud)
如您所见,每个任务都可以出现在多个任务组中.
我希望我的查询满足以下条件:
到目前为止我提出的最好的是这样的:
TaskGroup.objects.filter(
task__assignee=current_usr
).annotate(
task_count=Count('task__id')
).order_by('name')
Run Code Online (Sandbox Code Playgroud)
但它在进行计数之前会过滤掉所有内容,因此我看不到任务组的任务为零.
也许我正在思考但是我已经尝试过这么多年了,我现在正处于试图循环并自己做计算的时候.
我真的希望你能帮我节省一点我的理智!
我曾经遇到过完全相同的问题。一种解决方案是使用额外的子查询:
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')
Run Code Online (Sandbox Code Playgroud)
或类似的东西。可能是连接密钥错误。
但这太丑了。并打破了很多 DRY 和 DB 独立原则。
更好的选择可能是使用 2 个查询。第二个针对没有分配给该用户任何任务的特定组:
empty_groups = TaskGroup.objects.exclude(task__assignee=current_usr)
Run Code Online (Sandbox Code Playgroud)
然后只需迭代两组而不是一组。
| 归档时间: |
|
| 查看次数: |
395 次 |
| 最近记录: |