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

