'Category' object is not subscriptable Django

'Category' object is not subscriptable Django

Problem Description:

I am learning Django. I wrote a simple model and some views method in Django rest framework so that I can modify some particular attributes when needed to all the records that need that. Here is the model:

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

Then, I created this view to modify the isActive session when I call it:

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)

Even when the format of my request is correct ( I debugged each line ) when it comes to the line category.isActive = category[‘isActive’]it throws the error that‘Category’ object is not subscriptable`. I don’t know why or how to fix it.

I saw in the official documentation, on older StackOverflow questions that this is doable, but I don’t understand why I can’t.

Can someone please suggest what I am doing wrong? Thank you

Solution – 1

Specifically, the issue is here:

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

You set category to be an instance of the Category model (which in this case corresponds to a db record, but that bit is a little irrelevant).

Accessing attributes on a class instance is not done by the square bracket notation, but rather dot notation.

So instead of category['isActive'] use category.isActive

If category was a dictionary, eg.

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

Then you would use the square bracket notation as category["isActive"] to get that value.

As it is, it’s not a dict, so python thinks you are trying to subscript the instance somehow, which will not work.

Solution – 2

it’s a simple mistake.

Simply change it as follows and it should be fixed:

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()

What you’re doing is changing what the variable category is. You for loop and the unpacked variable is category, but then you get the model object and set the variable as category

So initially, the category variable is in fact a dictionary object, but you change it to be a django model object instance.

Rate this post
We use cookies in order to give you the best possible experience on our website. By continuing to use this site, you agree to our use of cookies.
Accept
Reject