Обойти порядок внутри Мета-класса - PullRequest
1 голос
/ 10 июля 2019

У меня есть две модели:

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

1 Ответ

1 голос
/ 10 июля 2019

Если вы хотите посчитать количество Member с на CourseMember с, я предлагаю вам работать наоборот:

from django.db.models import <b>Count</b>

CourseMember.objects.annotate(
    <b>nmember=Count('member')</b>
)

Это вернет набор CourseMember с, но где каждый CourseMember имеет дополнительный атрибут nmember, который хранит количество связанных Member объектов.

Вы можете получить набор запросов в своем вопросе, работая с:

Member.objects.values(
    'course_member'
).annotate(
    n=Count('id')
)<b>.order_by('course_member')</b>

Здесь также важен .order_by, поскольку в противном случае он действительно не будет «группировать» данные должным образом.

Но вышеизложенное имеет две потенциальные проблемы:

  1. будет не включать CourseMember с, которые не имеют CourseMember с; и
  2. здесь вы получаете QuerySet словарей, которые не настолько «богаты», как QuerySet из CourseMember s, так как на CourseMember s вы можете определить все виды дополнительного поведения, свойств, и т.д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...