Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

TypeError: 'User' object is not subscriptable

I am doing basic message app for users can send message other user...

here my models.py

class Messages(Model):
created_at = DateTimeField(null=True, blank=True, auto_now_add=True, editable=False,
                           verbose_name='Yaratılma Tarihi')
message = TextField(max_length=500, verbose_name='Mesaj', null=True, blank=True, )
sender = ForeignKey('dentis.User', verbose_name='Gönderen', related_name='User')
target = ForeignKey('dentis.User', verbose_name='Alıcı', related_name='target')
read_at = BooleanField(default=False, verbose_name='Okundu', blank=True, )

class Meta:
    verbose_name = 'Mesaj'
    verbose_name_plural = 'Mesajlar'

def __str__(self):
    return u'%s / %s/' % (self.sender.email, self.message[:15])

def get_type(self):
    return 'message'

here my rest api views

class MessageAPIView(ModelViewSet):
serializer_class = MessageSerializer
filter_backends = (filters.DjangoFilterBackend,)
filter_class = MessageUserFilter
permission_classes = (AuthenticatedUserOnly,)

def get_user(self):
    if self.request.user.is_authenticated():
        return self.request.user
    else:
        raise Http404

def get_queryset(self):
    messages = Messages.objects.filter(
        Q(sender=self.get_user()) | Q(target=self.get_user())).order_by('-created_at').distinct()

    return messages

def perform_create(self, serializer):
    if self.request.user.is_authenticated():

        try:
            target_email = serializer.validated_data['target']['email']
            target = User.objects.get(email=target_email)
        except User.DoesNotExist:
            raise ValidationError('Hedef Kullanıcı bulunamadı')
        except KeyError:
            raise ValidationError('Hedef kullanıcı belirtilmedi')

        sender = self.request.user
        serializer.save(sender=sender, target=target)
    else:
        raise Http404

And my Serializers

class MessageSerializer(ModelSerializer):
sender = UserMobileSerializer(read_only=True)
target = UserMobileSerializer()

class Meta:
    model = Messages
    fields = '__all__'

When I send a message then return this error:

line 163, in perform_create target_email = serializer.validated_data['target']['email']

TypeError: 'User' object is not subscriptable

[28/Apr/2018 18:56:04] "POST /api/v1/message/ HTTP/1.1" 500 15742

My usermodel use

USERNAME_FIELD = 'email'

not use username field

like image 842
oerbas Avatar asked Mar 08 '26 15:03

oerbas


2 Answers

validated_data['target'] gives you the value of the target field - which, as the error says, is an instance of User. You use normal attribute syntax to access its fields.

target_email = serializer.validated_data['target'].email
like image 152
Daniel Roseman Avatar answered Mar 11 '26 04:03

Daniel Roseman


I was using fastapi.

class UserDetails(BaseModel):
    email: str
    price: int
   
@app.post ("/create_checkout_session/")
async def create_checkout_session(user_details:UserDetails):
    price = user_details.price
   

I got this error:

price = user_details['price']
     
TypeError: 'UserDetails' object is not subscriptable

Instead of passing key I used dot operator (.) to access value:

price = user_details.price
like image 26
Muhammad Hashim Khan Avatar answered Mar 11 '26 04:03

Muhammad Hashim Khan



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!