绕过Meta类内部的排序

时间:2019-07-09 21:04:53

标签: django

我有两个模型:

class Member(models.Model):
    course_member = models.ForeignKey(CourseMember, on_delete=models.CASCADE

    class Meta:
        db_table = 'member'
        ordering = ['-id']

class CourseMember(models.Model):
    name = models.CharField(max_length=30)

当我尝试运行以获取具有course_member的成员的计数时。

Member.objects.values('course_member').aggregate(Count('id'))

我一直收到错误的数据。似乎不是按照Course_member分组,而是按照member_id分组,而我用单独的结果进行查询。

Django文档警告此问题see link

我试图查看是否有解决方案可以绕过此问题,而不仅仅是等待Django 3.1

1 个答案:

答案 0 :(得分:1)

如果您要计算Member s CourseMember s的数量,建议您采用其他方法:

from django.db.models import Count

CourseMember.objects.annotate(
    nmember=Count('member')
)

这将返回一组CourseMember,但是每个CourseMember都有一个额外的属性nmember,用于存储相关Member对象的数量。

您可以使用以下方法获取问题中的查询集:

Member.objects.values(
    'course_member'
).annotate(
    n=Count('id')
).order_by('course_member')

.order_by在这里也很重要,因为否则,它实际上将无法正确地“分组”数据。

但是上面有两个潜在的问题:

  1. 它将包括没有CourseMember的{​​{1}}个;和
  2. 在这里您获得CourseMember的字典,而不是QuerySet中的QuerySet那样的“丰富”,因为在CourseMember s上,您可以定义各种额外的行为,属性等。