#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