Объект '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.