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
相关产品推荐
相关产品推荐

