按外来键字段的数量排序?

AP2*_*257 44 django

这几乎肯定是一个重复的问题,在这种情况下道歉,但我一直在搜索大约半小时的SO,但在这里找不到答案.对不起,我可能使用了错误的搜索字词.

我有一个用户模型和一个提交模型.每个Submission都有一个名为user_submitted的ForeignKey字段,用于上传它的用户.

class Submission(models.Model):
    uploaded_by = models.ForeignKey('User')
class User(models.Model):
    name = models.CharField(max_length=250 )
Run Code Online (Sandbox Code Playgroud)

我的问题很简单:如何获得提交最多的三个用户的列表?

我尝试在User模型上创建num_submissions方法:

def num_submissions(self):
    num_submissions = Submission.objects.filter(uploaded_by=self).count()
    return num_submissions
Run Code Online (Sandbox Code Playgroud)

然后做:

top_users = User.objects.filter(problem_user=False).order_by('num_submissions')[:3]
Run Code Online (Sandbox Code Playgroud)

但这失败了,我尝试过的所有其他事情都失败了.我可以使用智能数据库查询实际执行此操作吗?或者我应该在视图文件中做些更hacky的事情?

Ben*_*mes 103

from django.db.models import Count
top_users = User.objects.filter(problem_user=False) \
                .annotate(num_submissions=Count('submission')) \
                .order_by('-num_submissions')[:3]
Run Code Online (Sandbox Code Playgroud)

你没有problem_user在你的示例模型代码中提到,但我已经假设它是一个BooleanField开启User.

  • 非常好,它使用`Profile.objects.annotate(num_items = Count('user__item'))工作事件.order_by(' - num_items')` (2认同)