开发用户消息应用时遇TypeError: 'User'对象不可下标问题求助
解决TypeError: 'User' object is not subscriptable问题
嘿,这个错误的根源其实出在你Messages模型里的related_name设置上,我来给你拆解一下:
问题分析
你给sender字段设置的related_name='User'和你的用户模型名完全重名了!当你尝试通过某个User实例去访问它发送的消息时(比如my_user.User),Django会把这个related_name当成User对象的属性,但User本身不是可下标访问的对象(不能像字典那样用[]取值),所以直接触发了'User' object is not subscriptable这个错误。
另外你的read_at字段定义也不完整,需要补充默认值或者其他必要参数哦。
修复方案
把两个ForeignKey的related_name改成有语义且不冲突的名字,同时补全read_at字段的定义:
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的反向关联名改为sent_messages,方便后续查询用户发送的消息 sender = ForeignKey('dentis.User', verbose_name='Gönderen', related_name='sent_messages') # 将target的反向关联名改为received_messages,方便查询用户收到的消息 target = ForeignKey('dentis.User', verbose_name='Alıcı', related_name='received_messages') # 补全read_at字段,默认设为未读状态 read_at = BooleanField(default=False, verbose_name='Okundu mu')
为什么这样改?
related_name是Django用来做反向关联查询的别名,现在你可以用some_user.sent_messages.all()快速获取这个用户发送的所有消息,用some_user.received_messages.all()获取收到的消息,逻辑清晰又直观。- 绝对不能把
related_name设成和关联模型同名的字符串,否则会覆盖模型本身的引用,导致访问时出现类型错误。
内容的提问来源于stack exchange,提问作者oerbas
相关产品推荐
相关产品推荐

