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

Django新用户提交个人信息表单报PersonalInfo matching query does not exist错误

问题成因
  • PersonalInfo模型未定义关联用户的外键字段
    你当前的PersonalInfo模型代码中没有声明和系统用户表关联的user字段,执行PersonalInfo.objects.get(user=user)查询时,数据库中根本没有对应的user_id匹配列,自然无法查询到任何记录,直接抛出不存在错误。即便你在保存时手动赋值profile.user = request.user,这个属性也不会被持久化到数据库,属于无效操作。
  • 新用户不存在预先创建的PersonalInfo关联记录
    就算你后续补全了user外键字段,新用户注册完成后默认不会自动生成对应的PersonalInfo记录,Django的get()方法要求查询结果必须严格匹配1条,找不到对应记录就会直接抛出DoesNotExist异常。你移除instance参数后,ModelForm默认走新建逻辑,所以每次提交都会生成一条新的PersonalInfo记录,无法实现更新已有记录的需求。
修复步骤
  1. 首先补全PersonalInfo模型的外键定义,修改models.py:
from django.contrib.auth import get_user_model
User = get_user_model()

class Field(models.Model):
    id = models.AutoField(primary_key=True)
    slug = models.CharField(max_length=16, default='default')
    # 原代码此处漏写models前缀,补充完整
    title = models.CharField(max_length=32)

class PersonalInfo(models.Model):
    id = models.AutoField(primary_key=True)
    # 新增和用户一对一关联的外键,删除用户时同步删除关联的个人信息
    user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="personal_info")
    isCompleted = models.BooleanField(default=False)
    interested_fields = models.ManyToManyField(Field, blank=True)

修改完成后执行python manage.py makemigrations和python manage.py migrate同步数据库结构。

  1. 调整视图查询逻辑,用get_or_create()方法兼容新用户无记录的场景,修改views.py的post方法:
def post(self, request, *args, **kwargs):
    user = request.user
    # 存在则获取对应记录,不存在则自动创建绑定当前用户的新记录
    personal_info, created = PersonalInfo.objects.get_or_create(user=user)
    if request.method == 'POST':
        form = InterestedFieldsForm(request.POST, instance=personal_info)
        if form.is_valid():
            form.save()
    else:
        form = InterestedFieldsForm(instance=personal_info)
    return render(request, 'reg/done.html', context={'form': form})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:18:04