Error de atributo: el objeto ‘Serializer’ no tiene el atributo ‘Meta’ en Django Rest Framework.
Estoy usando el serializador serializers.Serializer en lugar de ModelSerializer, que no requiere una clase Meta, pero sigue diciendo que el objeto no tiene el atributo Meta. No estoy seguro cuál es el problema, pero cuando ejecuto el servidor local, la página principal da error diciendo “api fetch error” y en la terminal dice AttributeError: el objeto “Serializer” no tiene el atributo “Meta”.
Mi vista:
class ClassView(viewsets.ModelViewSet):
queryset = Class.objects.all().order_by(‘-created_at’)
serializer_class = ClassSerializer
serializer_action_classes = {
‘get_all_students_of_a_class’: ClassDetailSerializer,
}
# .annotate(total_students=Count(‘students_in_class’))
def get_serializer_class(self):
'''
Devuelve una clase de serializador basada en la acción
que se ha definido.
'''
try:
return self.serializer_action_classes[self.action]
except (KeyError, AttributeError):
return super(ClassView, self).get_serializer_class()
def get_all_students_of_a_class(self,request,pk=None):
'''
Devuelve los detalles de una clase con todos los estudiantes inscritos
en la clase junto con la materia.
'''
id = pk
if self.is_teacher(id):
online_classes = get_object_or_404(Class, id=id)
students = Student.objects.filter(online_class__id=id)
subject_details = Subject.objects.get(online_class__id=id)
total_students_in_class = online_classes.total_students_in_class
created_at = online_classes.created_at
updated_at = online_classes.updated_at
data = {
"teacher": self.get_teacher_instance(),
'total_students_in_class': total_students_in_class,
"students_in_class": students,
"subject": subject_details,
'created_at': created_at,
'last_updated_at': updated_at,
}
serializer_class = self.get_serializer_class()
serializer = serializer_class(data)
return Response(serializer.data, status=status.HTTP_200_OK)
Mi serializador:
class ClassDetailSerializer(serializers.Serializer):
teacher = serializers.StringRelatedField()
subject = SubjectLevelSerializer()
total_students_in_class = serializers.ReadOnlyField()
students_in_class = serializers.StringRelatedField(many=True)
created_at = serializers.DateTimeField(read_only=True)
last_updated_at = serializers.DateTimeField(read_only=True)
Mi url:
path(“class/
),
Sin embargo, funciona y puedo realizar acciones si voy a localhost/admin y a otras llamadas API desde localhost.
davy.ai
El problema parece estar con ClassDetailSerializer, que hereda de serializers.Serializer en lugar de serializers.ModelSerializer. La clase ModelSerializer genera automáticamente una clase Meta para el serializer, que incluye un atributo de modelo que identifica el modelo en el que se basa el serializer. En cambio, Serializer requiere que el usuario defina manualmente los campos que se serializarán/deserializarán, incluidas las instancias de modelos asociados.
Para solucionar este problema, debe reemplazar serializers.Serializer con serializers.ModelSerializer en la definición de su ClassDetailSerializer y especificar el modelo en el que se basará el serializer dentro de la clase Meta, así:
Esto debería permitir la creación correcta de la clase Meta para el serializer y evitar el error ‘AttributeError: ‘Serializer’ object has no attribute ‘Meta”’.