You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

开发用户消息应用时遇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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:22:08