Оригинальный текст исключения был: Объект 'QuerySet' не имеет атрибута 'name'.
Получена ошибка AttributeError при попытке получить значение для имени поля сериализатора StudentSerializer. Поле сериализатора может быть названо неверно и не соответствовать какому-либо атрибуту или ключу экземпляра QuerySet. Оригинальный текст исключения был: 'QuerySet' object has no attribute 'name'.
my models.py:
class Student(models.Model):
name = models.CharField(max_length=45, verbose_name="ФИО")
..
class Group(models.Model):
name = models.SmallIntegerField(verbose_name="Номер группы")
..
class StudentInGroup(models.Model):
input_Students = models.DateField(verbose_name="Студент вступил в группу")
output_Students = models.DateField(
verbose_name="Студент покинул группу", blank=True, null=True)
students = models.ManyToManyField(
Student, verbose_name="Студент", related_name="Group")
groups = models.ManyToManyField(
Group, verbose_name="Группа", related_name="StudentInGroup")
..
class Subject(models.Model):
name = models.CharField(max_length=50, verbose_name="Название предмета")
groups = models.ForeignKey(Group, on_delete=models.PROTECT)
..
class Lesson(models.Model):
date = models.CharField(max_length=15, verbose_name="Дата занятия")
subjects = models.ForeignKey(
Subject, verbose_name="Проведенные занятия", blank=True, on_delete=models.PROTECT)
groups = models.ForeignKey(
Group, verbose_name="Группа на занятии", blank=True, on_delete=models.PROTECT)
..
class Progress(models.Model):
students = models.ForeignKey(
Student, on_delete=models.PROTECT, verbose_name="Студент", blank=True)
lessons = models.ForeignKey(
Lesson, on_delete=models.PROTECT, verbose_name="Занятия", blank=True)
attendance = models.CharField(
max_length=3, default='Да', verbose_name='Присутствие')
grade = models.PositiveSmallIntegerField(
verbose_name='Оценка за занятие', default=0)
my views.py:
@api_view(['GET', 'POST'])
def subject_detail(request, pk):
if request.method == 'GET':
subjects = Subject.objects.get(pk=pk)
#view_subjects = Subject.objects.filter(pk=pk)
lessons = subjects.lesson_set.order_by('date')
view_progreses = []
for lesson in lessons:
progress = lesson.progress_set.all()
view_progreses.append(progress)
relationships = subjects.groups.StudentInGroup.all()
view_students = []
for relationship in relationships:
student = relationship.students.all()
view_students.append(student)
subjects_serializer = SubjectSerializer(subjects) # many=True
lessons_serializer = LessonSerializer(lessons, many=True)
students_serializer = StudentSerializer(view_students, many=True)
progreses_serializer = ProgressSerializer(view_progreses, many=True)
response_results = {
'subjects_serializer': subjects_serializer.data,
'lessons_serializer': lessons_serializer.data,
'progreses_serializer': progreses_serializer.data,
'students_serializer': students_serializer.data,
}
return Response(response_results)
Пожалуйста, добавьте ваш код сериализатора, так как модель и представления выглядят хорошо.
Метод .all() возвращает QuerySet, а не список объектов, что вам и нужно. Итерируйте QuerySet с помощью метода .get(), чтобы получить отдельные объекты :-)
Вот документы для этого. Удачи
Я ответил на свой вопрос. Необходимо было переписать следующим образом:
@api_view(['GET', 'POST'])
def subject_detail(request, pk):
if request.method == 'GET':
subjects = Subject.objects.get(pk=pk)
#view_subjects = Subject.objects.filter(pk=pk)
lessons = subjects.lesson_set.order_by('date')
view_progreses = []
for lesson in lessons:
for progress in lesson.progress_set.all():
view_progreses.append(progress)
group = subjects.groups
relationships = group.StudentInGroup.all()
view_students = []
# for relationship in relationships:
# student = relationship.students.all()
# view_students.append(student)
for relationship in relationships:
for student in relationship.students.all():
view_students.append(student)
subjects_serializer = SubjectSerializer(subjects) # many=True
lessons_serializer = LessonSerializer(lessons, many=True)
students_serializer = StudentSerializer(view_students, many=True)
progreses_serializer = ProgressSerializer(view_progreses, many=True)
response_results = {
'subject': subjects_serializer.data,
'lesson': lessons_serializer.data,
'progress': progreses_serializer.data,
'student': students_serializer.data,
}
return Response(response_results)