Django DRF как "обновить несколько объектов"?

Я пытаюсь обновить несколько объектов, однако я не могу понять, что я делаю неправильно. Я получаю набор объектов, которые мне нужно обновить, путем фильтрации по названию школы ( вот как выглядит моя БД), но я получаю "'ListSerializer' object is not iterable", когда я включаю {% render_form serializer %} в свой шаблон.

Я загрузил свой проект на github

Релевантный код:

models.py:

class School(models.Model):
    schoolName = models.CharField(max_length=200, default='No Data')
    className = models.CharField(max_length=200, default='No Data')
    studentName = models.CharField(max_length=200, default='No Data')
    studentGrade = models.IntegerField(null=True, blank=True)
    professorName = models.CharField(max_length=200, default='No Data')

    def __str__(self):
        return self.schoolName

serializers.py:

class SchoolPartListSerializer(serializers.ListSerializer):
    def update(self, instance, validated_data):
        # Maps for id->instance and id->data item.
        school_mapping = {school.id: school for school in instance}
        data_mapping= {schoolName['id']: schoolName for schoolName in validated_data}

        # Perform creations and updates.
        ret = []
        for school_id, data in data_mapping.schoolName():
            school = school_mapping.get(school_id, None)
            if school is None:
                ret.append(self.child.create(data))
            else:
                ret.append(self.child.update(school, data))

        # Perform deletions.
        for school_id, school in school_mapping.schoolName():
            if school_id not in data_mapping:
                school.delete()
        return ret

class SchoolPartSerializer(serializers.Serializer):
    id = serializers.IntegerField()

    class Meta:
        list_serializer_class = SchoolPartListSerializer
        model = School
        fields =  ('id', 'url', 'schoolName')
        extra_kwargs = {
           'id':{
                    'read_only': False,
                    'allow_null': True,
                },
                'schoolName':{
                    'required': True,
                }
        }

views.py:


class SchoolDetail(APIView):
    renderer_classes = [TemplateHTMLRenderer]
    template_name = 'tmp_school_detail.html'

    def get(self, request, name, *args, **kwargs):
        school = School.objects.filter(schoolName=name)
        serializer_context = {'request': request, }
        serializer = SchoolPartSerializer(instance=school, many=True, context=serializer_context)
        return Response({'serializer': serializer, 'school': school})

    def post(self, request, name):
        school = School.objects.filter(schoolName=name)
        #school = get_object_or_404(School.objects.only('id', 'schoolName'))
        serializer_context = {'request': request,}
        serializer = SchoolPartSerializer(instance=school, many=True, data=request.data, context=serializer_context)
        if not serializer.is_valid():
            return Response({'serializer': serializer, 'school': school})
        serializer.save()
        return redirect('tmp_school-list')

urls.py:

 path(r'tmp_school_list/', views.SchoolList.as_view(), name='tmp_school-list'),
 path(r'tmp_school_detail/<str:name>/', views.SchoolDetail.as_view(), name='tmp_school-detail'),

tmp_school_list.html:

{% load rest_framework %}

<html><body>

<h1>School - {{ school.schoolName }}</h1>

<form action="{% url 'tmp_school-detail' name=school.first.schoolName %}" method="POST">
    {% csrf_token %}
    {% render_form serializer %}
    <input type="submit" value="Save">
</form>

<a href="{% url 'tmp_school-list' %}"> Back </a>
</body></html>

Я пробовал следовать документации и искал другие решения (это лучшее, что я нашел), но у меня ничего не получилось.

Цель состоит в том, чтобы обновить все вводы данных, которые имеют определенное название школы.

Попробуйте изменить

school = School.objects.filter(schoolName=name)

to

school = School.objects.filter(schoolName=name).all()

в обоих методах get и post, и повторите попытку

Вернуться на верх