自定义多域上聚集的Django奇怪行为

自定义多域上聚集的Django奇怪行为,django,database,django-aggregation,Django,Database,Django Aggregation,我在django的manytomy字段上遇到了一些意想不到的聚合行为(对我来说) 我有以下模式: class ContestTaskRelationship(models.Model): contest = models.ForeignKey('Contest', on_delete=models.CASCADE) task = models.ForeignKey('Task', on_delete=models.CASCADE) solved = models.Many

我在django的
manytomy
字段上遇到了一些意想不到的聚合行为(对我来说)

我有以下模式:

class ContestTaskRelationship(models.Model):
    contest = models.ForeignKey('Contest', on_delete=models.CASCADE)
    task = models.ForeignKey('Task', on_delete=models.CASCADE)
    solved = models.ManyToManyField('User', related_name='contests_tasks_solved', blank=True)
    cost = models.IntegerField(default=0)

class Contest(models.Model):
    tasks = models.ManyToManyField('Task',
                                   related_name='contests',
                                   blank=True,
                                   through='ContestTaskRelationship')

class Task(models.Model):
    pass
然后我有一个任务和两个竞赛,与该任务相关。如果我尝试对
contestictTaskRelationship
模型的计数进行注释(假设
contest
是竞赛之一):

我得到
task.number\u solved==1
,但当我这样尝试时:

task = Task.objects.filter(id=1).annotate(number_solved=Count('contesttaskrelationship')).first()
我得到了预期的结果
task.number\u solved==2
。为什么呢?它不是同一个对象和同一个字段吗


UPD:我发现在第一个示例中,向查询添加了附加条件,
contest\u id
与相应contest的
id
进行比较。它在什么地方有记录吗?我找不到任何东西。

编写此代码时:

Task.objects.get(id=1)
您将获得任务实例,并且在您的任务模型中似乎有一个名为“annotate”的方法,带有“number\u solved”参数。在某些queryset方法(get、count、aggregate、last、first)存在并可能存在更多之后,您无法进行任何注释。此方法不返回queryset

如果要查看查询并进行比较

你可以做两件事:

  • 打印(Contest.objects.all().query)#将原始查询返回数据库
  • 安装django extensions并使用以下命令添加shell:

    ~# python manage.py shell_plus --print-sql  
    
  • 如果您看到查询,您可以对其进行比较并自己解决此问题

    ~# python manage.py shell_plus --print-sql