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
, и повторите попытку