Django项目运行报UserInfo matching query does not exist错误求助
Django
UserInfo matching query does not exist 报错原因及解决方案 报错原因
- 你在代码中使用
UserInfo.objects.get(user__pk=user_id)查询时,当前登录的Django内置User账号没有对应的UserInfo关联记录,get()方法查询不到匹配结果就会抛出该异常。 - 之所以会没有关联记录,是因为你定义的一对一外键仅定义了表关系,不会在创建
User账号时自动生成对应的UserInfo表行,尤其是通过createsuperuser命令创建的管理员账号,默认走Django原生创建逻辑,不会触发UserInfo的生成。
解决方案
你可以根据自己的业务需求选择以下任意一种方案:
方案1:使用get_or_create()自动补全缺失记录
直接修改视图中的查询逻辑,查不到关联记录时自动创建一条空的UserInfo记录,不需要改动其他业务代码:
def index(request): dict={} if request.user.is_authenticated: # 不需要重复查询User,request.user本身就是当前登录的User对象 user_basic_info = request.user # 第一个返回值是查询/创建的UserInfo对象,第二个是是否为新创建的布尔值 user_more_info, created = UserInfo.objects.get_or_create(user=request.user) dict = {'user_basic_info':user_basic_info, 'user_more_info':user_more_info} return render(request, 'Login_app/index.html', context=dict)
方案2:配置信号自动创建关联记录
在models.py中添加Django信号监听逻辑,只要有User对象被创建,就自动生成对应的UserInfo记录,从根源避免该问题:
首先在models.py头部导入信号依赖:
from django.db.models.signals import post_save from django.dispatch import receiver
然后在UserInfo类定义下方添加信号处理函数:
@receiver(post_save, sender=User) def create_user_info(sender, instance, created, **kwargs): if created: UserInfo.objects.create(user=instance) @receiver(post_save, sender=User) def save_user_info(sender, instance, **kwargs): instance.userinfo.save()
方案3:捕获异常自定义处理逻辑
如果你不想自动创建空记录,可以捕获查询异常,根据业务需求返回空值或者跳转到信息补全页面:
def index(request): dict={} if request.user.is_authenticated: user_basic_info = request.user try: user_more_info = UserInfo.objects.get(user=request.user) except UserInfo.DoesNotExist: # 可以赋值为空,也可以写重定向逻辑跳转到信息补全页面 user_more_info = None dict = {'user_basic_info':user_basic_info, 'user_more_info':user_more_info} return render(request, 'Login_app/index.html', context=dict)
内容的提问来源于stack exchange,提问作者ccttanim
相关产品推荐
相关产品推荐

