Объект 'Category' не является подписываемым Django

Я изучаю Django. Я написал простую модель и несколько методов представления в Django rest framework, чтобы я мог изменять некоторые определенные атрибуты, когда это необходимо, для всех записей, которые в этом нуждаются. Вот модель:

from django.db import models

class Category(models.Model):
    name = models.CharField(max_length=255)
    isActive = models.BooleanField(default=True)

    def __str__(self):
        return self.name

Затем, я создал это представление для изменения сессии isActive, когда я вызываю ее:

class CategoriesChangeActiveView(views.APIView):
    def post(self, request, format=None):
        try:
            categories = request.data.get('categories')
            for category in categories:
                category = Category.objects.get(id=category['id'])
                category.isActive = category['isActive']
                category.save()
        except Exception as e:
            return Response({'error': 'Bad request'}, status=status.HTTP_400_BAD_REQUEST)
        return Response({'success': 'Active changed'}, status=status.HTTP_200_OK)

Даже когда формат моего запроса правильный (я отлаживал каждую строку), когда дело доходит до строки category.isActive = category['isActive']it throws the error that объект "Category" не является подзаписываемым. Я не знаю почему и как это исправить.

Я видел в официальной документации, на старых вопросах StackOverflow, что это возможно, но я не понимаю, почему я не могу.

Может кто-нибудь подсказать, что я делаю неправильно? Спасибо

Если вы видите ошибку "'Category' object is not subscriptable" в Django, это означает, что вы пытаетесь использовать нотацию квадратных скобок (например, category[0]) для объекта Category, но эта нотация не поддерживается классом Category.

В Django обозначение квадратных скобок используется для доступа к элементам QuerySet, который представляет собой спископодобный объект, представляющий коллекцию записей базы данных. Однако объект Category представляет одну запись в базе данных, а не коллекцию записей, поэтому вы не можете использовать для него обозначение квадратных скобок.

Для доступа к свойствам объекта Category можно использовать точечную нотацию (например, category.name). Это позволит вам получить доступ к отдельным полям объекта Category, таким как его имя или id.

Конкретно, вопрос здесь:

category = Category.objects.get(id=category['id'])
category.isActive = category['isActive']

Вы устанавливаете category как экземпляр модели Category (что в данном случае соответствует записи в базе данных, но этот момент не имеет значения).

Для получения атрибутов экземпляра класса используется не квадратная скобка, а точечная нотация.

Поэтому вместо category['isActive'] используйте category.isActive

Если бы категория была словарем, например

category = {
    "name": "cat",
    "isActive": True,
}

Затем вы используете обозначение квадратных скобок как category["isActive"], чтобы получить это значение.

Как таковой, это не dict, поэтому python думает, что вы пытаетесь как-то подзаписать экземпляр, что не сработает.

это простая ошибка.

Просто измените его следующим образом, и он будет исправлен:

categories = request.data.get('categories')
        for category in categories:
            category_obj = Category.objects.get(id=category['id'])
            category_obj.isActive = category['isActive']
            category_obj.save()

Вы меняете значение переменной category. Вы выполняете цикл for и распакованной переменной является category, но затем вы получаете объект модели и устанавливаете переменную как category

Изначально переменная category на самом деле является объектом словаря, но вы меняете ее на экземпляр объекта модели django.

Вернуться на верх