У меня есть две модели:
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 предупреждает об этой проблеме, см. ссылку.
Я пытаюсь найти решение, позволяющее обойти эту проблему, вместо того, чтобы просто ждать Django 3.1.





Если вы хотите подсчитать количество Members заCourseMembers, я предлагаю вам действовать наоборот:
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, поскольку в противном случае он действительно не будет правильно «группировать» данные.
Но вышеизложенное имеет две потенциальные проблемы:
CourseMember, у которых нет CourseMember; а такжеQuerySet словарей, которые не так «богаты», как QuerySetCourseMember, поскольку в CourseMember вы можете определить всевозможные дополнительные поведения, свойства и т. д.
Добавление order_by в конце переопределит настройку порядка внутри класса Meta. Спасибо!