Проверьте, имеет ли объект отношение с другим в поле ManyToMany и поле агрегата - PullRequest
0 голосов
/ 14 апреля 2020

У меня есть пара моделей следующим образом:

class Student(models.Model):
    name = models.CharField()
    classes = models.ManyToManyField(Class, related_name="students")

class Class(models.Model):
    nombre = models.CharField

Мне нужен такой способ, чтобы при запросе студентов в определенном классе вместо простого возврата студентов, зачисленных в этот класс, он возвращал QuerySet всех студентов, каждый с агрегированным полем, указывающим, зарегистрирован ли такой студент в этом классе, например:

[{'name':'student A', 'enrolled_in_physics':True}, {'name':'student B', 'enrolled_in_physics':False}]

Я думаю, что это может быть достигнуто через F() expressions наряду с ExpressionWrapper, но понятия не имею, как их реализовать; Кроме того, документация и примеры не очень удобны для новичков. Спасибо за помощь * QuerySet , такой, что позвольте мне сделать что-то вроде этого:

student_a = query[0]
student_a.name
>>>'A'
student_a.enrolled_in_physics
>>>True

1 Ответ

0 голосов
/ 14 апреля 2020

ОБНОВЛЕНО Вы можете попытаться определить метод в классе ученика:

class Student(models.Model):
    name = models.CharField()
    classes = models.ManyToManyField(Class, related_name="students")

    def enrolled_in_class(self,class_name):
        if len(Class.objects.filter(nombre=class_name,students__in=self)) > 0:
            return True
        else:
            return False

students = Student.objects.all()
student_a = students[0]
student_a.name
student_a.enrolled_in_class('physics')

Оригинальный ответ:

Редактировать: Извините, неправильно прочитанный вопрос, я постараюсь получить ответ вместе для того, что вы на самом деле хотели: список всех учащихся и двоичное истинное ложное, если они зачислены в указанный c класс.

Хорошо, я читаю это как: мне нужен запрос, который возвращает список словарей с указанием ученика и зачисления в класс.

#Assume: class_name = 'physics'
def get_class_list(class_name):
    filtered_class = Class.object.get(nombre=class_name)
    student_names = Students.objects.filter(classes__contains=filtered_class).values_list('name',flat=True)
    class_list = []
    for name in student_names:
        class_list = {}
        class_list['name'] = name
        enrolled_class_string = 'enrolled_in_' + class_name 
        class_list[enrolled_class_string] = True

    return class_list

Это даст вам список словари с ключами с именем 'name' и 'class__name'

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