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

如何在Django中按职位需求筛选学生数据并邮件推送对应企业?

Django实现职位-学生技能匹配并推送邮件至HR邮箱

需求概述

根据职位空缺(Vacancy)的技能要求(skillreq)及毕业年份要求,筛选出匹配的学生(Student),并将学生详情精准推送给发布该职位的企业(Company)HR邮箱。例如戴尔的职位匹配学生Rini,红米的职位匹配学生Remya,需确保邮件推送的准确性。

现有模型代码

class Student(models.Model):
    name = models.CharField(max_length=50)
    skills = models.ManyToManyField(Skill)
    passout = models.ManyToManyField(Passout)
    email = models.EmailField(max_length=254 ,null = True)
    resume = models.ImageField(upload_to='media/resume', height_field=None, width_field=None, max_length=None , null=True)
    create_date = models.DateTimeField('created date',auto_now_add=True)
    def __str__(self):
        return self.name
    
class Company(models.Model):
    comp_name = models.CharField(max_length=50)
    loc = models.CharField(max_length=50)
    hr_name = models.CharField(max_length=50)
    hr_email = models.EmailField(max_length=254)
    def __str__(self):
        return self.comp_name

class Vacanccy(models.Model):
    com_name = models.ForeignKey(Company, on_delete=models.CASCADE)
    skillreq = models.ManyToManyField(Skill)
    yearofpass = models.ManyToManyField(Passout)
    title = models.CharField(max_length=255)
    expiry_date = models.CharField(max_length=50)
    def __str__(self):
        return str(self.com_name) 

实现步骤及代码

1. 编写匹配与邮件发送核心函数

该函数负责遍历所有职位,筛选匹配学生并发送邮件:

from django.core.mail import EmailMessage
from .models import Vacanccy, Student

def match_students_to_vacancies():
    # 遍历所有职位(可后续添加过期过滤逻辑,需先将expiry_date改为DateField)
    vacancies = Vacanccy.objects.all()
    
    for vacancy in vacancies:
        # 获取职位要求的技能和毕业年份集合
        required_skills = vacancy.skillreq.all()
        required_passouts = vacancy.yearofpass.all()
        
        # 筛选同时满足技能、毕业年份匹配的学生
        matched_students = Student.objects.filter(
            skills__in=required_skills,
            passout__in=required_passouts
        ).distinct()
        
        if not matched_students:
            continue
        
        # 构建邮件内容
        company = vacancy.com_name
        subject = f"匹配到符合职位【{vacancy.title}】的学生"
        message_body = f"您好{company.hr_name},以下是符合您发布的职位【{vacancy.title}】的学生详情:\n\n"
        
        for student in matched_students:
            # 格式化学生技能与毕业年份
            student_skills = ", ".join([skill.name for skill in student.skills.all()])
            student_passouts = ", ".join([str(p.year) for p in student.passout.all()])
            
            message_body += f"姓名:{student.name}\n"
            message_body += f"联系邮箱:{student.email}\n"
            message_body += f"掌握技能:{student_skills}\n"
            message_body += f"毕业年份:{student_passouts}\n"
            if student.resume:
                message_body += f"简历地址:{student.resume.url}\n"
            message_body += "-------------------------\n"
        
        # 发送邮件
        email = EmailMessage(
            subject=subject,
            body=message_body,
            to=[company.hr_email],
        )
        # 如需附加简历文件,可取消下方注释
        # for student in matched_students:
        #     if student.resume:
        #         email.attach_file(student.resume.path)
        
        email.send()

2. 创建管理命令(手动触发匹配)

在应用目录下创建management/commands/match_and_send.py,方便通过命令行执行匹配任务:

from django.core.management.base import BaseCommand
from ...models import match_students_to_vacancies  # 替换为实际的导入路径

class Command(BaseCommand):
    help = '执行学生-职位匹配并向HR发送邮件'

    def handle(self, *args, **options):
        match_students_to_vacancies()
        self.stdout.write(self.style.SUCCESS('匹配完成,邮件已发送'))

执行命令:python manage.py match_and_send

3. 可选:自动触发配置

  • 职位创建/更新时触发:在Vacanccy模型的save方法中调用match_students_to_vacancies
  • 定时执行:使用django-celery-beat配置定时任务,每天/每周自动执行匹配逻辑

关键注意事项

  • 模型中Vacanccy存在拼写错误,建议修改为Vacancy以避免混淆
  • expiry_date字段当前为CharField,建议改为DateField,方便过滤已过期的职位
  • 需在settings.py中配置邮件服务参数:
    EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
    EMAIL_HOST = 'smtp.example.com'
    EMAIL_PORT = 587
    EMAIL_USE_TLS = True
    EMAIL_HOST_USER = 'your-email@example.com'
    EMAIL_HOST_PASSWORD = 'your-password'
    
  • 若匹配学生数量较多,建议使用异步任务框架(如Celery)执行邮件发送,避免阻塞主线程
  • 可添加日志记录,便于排查匹配或邮件发送失败的问题

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 06:25:38