es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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//”,teacher.ClassView.as_view({“get”: “get_all_students_of_a_class”,”delete”:”destroy”}),
),

Sin embargo, funciona y puedo realizar acciones si voy a localhost/admin y a otras llamadas API desde localhost.

Tags:  , , , ,

Answer

  1. Avatar for 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í:

    class ClassDetailSerializer(serializers.ModelSerializer):
        class Meta:
            model = Class
            fields = ('teacher', 'subject', 'total_students_in_class', 'students_in_class', 'created_at', 'last_updated_at')
    

    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”’.

Comments are closed.