Ошибка имени: имя ‘Class’ не определено, как получить доступ к классу с тем же именем в Django?

#python #json #django #django-rest-framework #django-serializer

#python #json #django #django-rest-framework #django-сериализатор

Вопрос:

models.py файл, содержащий модель категории с полями name, description parent_category

 class Category(models.Model):
    """ Categories representation model """
    name = models.CharField(max_length=50)
    description = models.TextField()
    parent_category = models.ForeignKey('self', on_delete=models.SET_NULL, null=True, blank=True)
 

serializers.py файл, содержащий сериализатор модели категории со всеми его полями

 class CategorySerializer(serializers.ModelSerializer):
    """ product categories model serializer """
    parent_category = CategorySerializer()
    class Meta:
        """ profile model serializer Meta class """
        model = Category
        fields = (
            'id',
            'name',
            'description',
            'parent_category'
        )
 

views.py файл, представление API для получения всех доступных категорий с требуемой аутентификацией пользователя

 class GetCategoriesView(APIView):
    """ product categories getting view """
    permission_classes = (IsAuthenticated,)

    def get(self, request, *args, **kwargs):
        """ get request method """
        categories = Category.objects.all()
        serializer = CategorySerializer(categories, many=True, context={'request':request})
        return Response(data=serializer.data, status=HTTP_200_OK)
 

Ожидаемый результат, результат Json с рекурсивными данными из поля parent_category

 {
    name:'boy shoes',
    description:'boy shoes category description'
    parent_category:{
        name:'shoes',
        description:'shoes category description',
        parent_category:{
            name:'clothes',
            description:'clothes category description',
            parent_category: null
        }
    }
}
 

Ошибка, которую я получаю, я заметил, что я не могу получить прямой доступ к классу внутри того же класса

 NameError: name 'CategorySerializer' is not defined

    
 

Как я могу это решить?, я думаю, вы можете помочь решить эту проблему

Спасибо за внимание 🙂

Комментарии:

1. Можете ли вы показать весь файл views?

2. Почему у вас есть строка parent_category = CategorySerializer() в CategorySerializer классе? Поскольку стек ошибок не указан в описании, я предполагаю, что именно здесь возникает ошибка.

3. по умолчанию он будет отображать только идентификатор parent_category, например {name:’category’, description:’category description’, parent_category:3}, поэтому, если я хочу настроить его как json, я должен указать его класс сериализатора

Ответ №1:

Вы не можете использовать тот же класс, что и переменная класса. Просто для информации

 class SomeClass:
    x = SomeClass() # won't work NameError: name 'SomeClass' is not defined
    
    def __init__(self):
        x = SomeClass() # this is OK
 

Итак, вам нужно изменить свой сериализатор на что-то вроде этого

 class CategorySerializer(serializers.ModelSerializer):
    """ product categories model serializer """

    class Meta:
        """ profile model serializer Meta class """
        model = Category
        fields = (
            'id',
            'name',
            'description',
            'parent_category'
        )

    def get_fields(self):
        fields = super().get_fields()
        fields['parent_category'] = CategorySerializer()
        return fields