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

Django中使用简历解析器,无法将提取技能保存到用户Profile模型

简历解析后无法保存到Profile模型的问题解决

问题背景

开发支持用户上传简历的网站,通过简历解析脚本提取技能后,无法将提取的信息保存到Profile模型,保存步骤报错。

错误原因

  1. 核心错误:代码中resume = file_form.cleaned_data['resume']获取的是上传的文件对象,而非Profile模型实例。你试图给这个文件对象赋值Profile模型的字段(如name、skills)并调用save(),但文件对象不具备这些属性,直接导致报错。
  2. 字段名不匹配:模型中定义的是company_name,但代码里使用了resume.company_names,会引发属性不存在的错误。
  3. 多文件上传逻辑矛盾:Profile与User是一对一关联关系,一个用户只能对应一个Profile实例,当前循环处理多个文件的逻辑会导致多次覆盖同一个Profile的内容,不符合业务逻辑(若需支持多简历,建议新增独立的Resume模型关联到Profile)。

修正后的views.py代码

def homepage(request):
    if request.method == 'POST':
        file_form = UploadResumeModelForm(request.POST, request.FILES, instance=request.user.profile)
        files = request.FILES.getlist('resume')
        resumes_data = []
        if file_form.is_valid():
            # 获取当前用户的Profile实例
            profile = request.user.profile
            for file in files:
                try:
                    # 解析简历文件
                    parser = ResumeParser(file.temporary_file_path())
                    data = parser.get_extracted_data()
                    resumes_data.append(data)

                    # 更新Profile字段
                    profile.name = data.get('name')
                    profile.email = data.get('email')
                    profile.mobile_number = data.get('mobile_number')
                    profile.education = ', '.join(data.get('degree')) if data.get('degree') else None
                    # 修正字段名:company_name而非company_names
                    profile.company_name = data.get('company_names')
                    profile.college_name = data.get('college_name')
                    profile.designation = data.get('designation')
                    profile.total_experience = data.get('total_experience')
                    profile.skills = ', '.join(data.get('skills')) if data.get('skills') else None
                    profile.experience = ', '.join(data.get('experience')) if data.get('experience') else None
                    # 保存当前文件到Profile的resume字段(多文件会覆盖,若需多简历需调整模型)
                    profile.resume = file
                    profile.save()

                except IntegrityError:
                    messages.warning(request, f'重复简历:{file.name}')
                    return redirect('homepage')
            
            messages.success(request, '简历上传成功!')
            # 获取所有Profile数据用于展示
            resumes = Profile.objects.all()
            context = {'resumes': resumes}
            return render(request, 'authentication/resume.html', context)
    else:
        form = UploadResumeModelForm()
    return render(request, 'authentication/resume.html', {'form': form})

额外建议

如果需要支持一个用户上传多份简历,建议新增独立的Resume模型,与Profile建立外键关联:

# models.py新增Resume模型
class Resume(models.Model):
    profile = models.ForeignKey(Profile, on_delete=models.CASCADE, related_name='resumes')
    file = models.FileField(upload_to='resumes/')
    name = models.CharField(max_length=255, null=True, blank=True)
    email = models.CharField(max_length=255, null=True, blank=True)
    mobile_number = models.CharField(max_length=255, null=True, blank=True)
    education = models.CharField(max_length=255, null=True, blank=True)
    skills = models.CharField(max_length=1000, null=True, blank=True)
    company_name = models.CharField(max_length=1000, null=True, blank=True)
    college_name = models.CharField(max_length=1000, null=True, blank=True)
    designation = models.CharField(max_length=1000, null=True, blank=True)
    experience = models.CharField(max_length=1000, null=True, blank=True)
    total_experience = models.CharField(max_length=1000, null=True, blank=True)

    def __str__(self):
        return f"{self.profile.user.username}的简历"

对应的views.py逻辑也需要调整为创建Resume实例,而非更新Profile。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 01:45:34