Фильтрация обратного просмотра Django - PullRequest
0 голосов
/ 09 июля 2019

Итак, у меня есть две модели:

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

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

Как я могу получить всех участников CourseMe, у которых есть 2 или более участников?

И как я могу запретить CourseMember иметь более 1Участник.

Я думал об использовании Aggregate и Group by, но не знал, как это сделать.

1 Ответ

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

Как я могу получить всех участников курса, в которых есть 2 или более участников?

Вы можете использовать аннотирование для этого, и для этого будет проще, если вы добавите related_name в поле course_member элемента, например: course_member = models.ForeignKey(CourseMember, related_name='coursemember_member', on_delete=models.CASCADE), используя это related_name, вы можете сделать обратный поиск, чтобы ссылаться на дочернюю таблицу из родительской таблицы и аннотировать как это: CourseMember.objects.annotate(Count('coursemember_member')).filter(coursemember_member__count__gt=1) это даст желаемый результат.

И как мне запретить CourseMember иметь более 1 участника.

Это может быть достигнуто на уровне ORM / Database или на уровне программы, чтобы достичь этого на уровне ORM, вы можете создать курс «член-один» вместо отношения «многие-к-одному», как это course_member = models.OneToOneField(CourseMember, on_delete=models.CASCADE) здесь база данных выдает исключение если вы попытаетесь вставить несколько строк с одним и тем же course_member или иным образом на уровне программы, вы можете достичь этого, проверив, существует ли строка с тем же course_member, если она существует, обработайте ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...