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

Django框架下无法从含双外键的数据库表读取数据问题求助

问题根因

1. 模型定义违规

  • from是Python保留关键字,不能作为类属性/模型字段名使用,你在代码/模板中尝试访问req.from属于语法错误,根本无法读取到对应值,而Admin面板是直接读取数据库底层字段,所以能正常展示。
  • 两个外键同时指向User模型,未设置不同的related_name,会导致Django反向关系冲突,正常情况下迁移阶段就会报错。

2. 视图逻辑存在致命错误

  • 仅在捕获到req.DoesNotExist异常时给fr赋值,查询成功时fr变量未定义,运行会抛出NameError,导致程序无法走到给上下文赋值的步骤。
  • context_dict未初始化就直接赋值键值,也会抛出变量未定义的异常。
  • 使用get()查询未捕获MultipleObjectsReturned异常,如果存在多条符合条件的数据,程序会直接报错。

解决方案

第一步:修正模型定义

修改字段名为合法名称,补充related_name避免关系冲突,类名建议遵循Python规范大写开头:

class Request(models.Model):
    to_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="received_requests")
    from_user = models.ForeignKey(User, on_delete=models.CASCADE, related_name="sent_requests")

    def __str__(self):
        return "request sent"

修改完成后执行python manage.py makemigrations和python manage.py migrate同步数据库,同时调整之前get_or_create的字段参数适配新的字段名。

第二步:修正视图代码

修复逻辑漏洞,补充异常处理,初始化上下文:

def get(self, request):
    u = request.user
    context_dict = {}
    # 用filter+first替代get,避免多数据异常
    my_requests = Request.objects.filter(from_user=u).first()
    if not my_requests:
        return redirect(reverse('myapp:index'))
    context_dict['req'] = my_requests
    return render(request, 'myapp/req.html', context=context_dict)

第三步:调整模板取值

对应新的字段名修改模板渲染代码:

{{ req.to_user }}
{{ req.from_user.first_name }}

内容的提问来源于stack exchange,提问作者catBuddy

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 16:15:03