Django创建JobPost时报'JobPost' object has no attribute 'job_type'如何解决?
问题说明
我编写了一个simple view用于创建自定义职位并发布到job_portal,但遇到了下述报错。我当前在处理多对多字段,已经查阅过官方文档,但set方法似乎无法正常运行,我也附上了报错栈,报错提及的外键我已经设置为null,却仍出现这个奇怪的错误,提前感谢大家的帮助。
问题代码
def create_job(request): company_ = Company.objects.values_list('name', flat=True) if request.method == 'POST': # getting company by name for reference job_title = request.POST['job_title'] company_name = request.POST['company_name'] company = get_object_or_404(Company, name__iexact=company_name) address = request.POST.get('street_addr') city = request.POST['city'] state = request.POST['state'] country = request.POST['country'] zip_ = request.POST.get('zip_code') skill_names = request.POST.getlist('skill_name') start_salary = request.POST.get('salary_start') end_salary = request.POST.get('salary_end') # create job skills if not already present inside DB print(skill_names) skill_list = [] for skill in skill_names: skill_nam, created = Skillset.objects.get_or_create(skill_name__iexact=skill,defaults={ 'skill_name' : skill }) skill_list.append(skill_nam) job_loc = JobLocation(address=address, city=city, state=state, country=country, zip_code=zip_) job_loc.save() job_descrip = request.POST['job_descrip'] job_skill_ = request.POST.getlist('job_skill_level') job_pst = JobPost(title=job_title, cmpny_name=company, job_description=job_descrip, salary_start=start_salary,salary_end=end_salary) job_pst.job_posters.set(request.user) <--- i am getting error here job_pst.save() #skill_list has skill names job_skill_set = [] for job_skill_name, job_level in zip(skill_list, job_skill_): skil_set = Skillset.objects.filter(skill_name=job_skill_name) job_skillset = Job_Skillset(job_post=job_pst, skill_level=job_level) job_skillset.skill.set(skil_set) job_skill_set.append(job_skillset) Job_Skillset.objects.bulk_create(job_skill_set) messages.add_message(request,messages.SUCCESS,'Job post successfully submitted!') return redirect('/dashboard/') return render(request, 'company/company_entry.html', context={ 'contxt': 'job_contxt', 'company': company_, # 'skills_req': job_skill, })
报错信息
Traceback (most recent call last): File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\core\handlers\exception.py", line 47, in inner response = get_response(request) File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\core\handlers\base.py", line 181, in _get_response response = wrapped_callback(request, *callback_args, **callback_kwargs) File "C:\Users\atifs\Documents\job_portal\jobportal\job_management\views.py", line 60, in create_job job_pst.job_posters.set(request.user) File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 536, in __get__ return self.related_manager_cls(instance) File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\db\models\fields\related_descriptors.py", line 851, in __init__ raise ValueError('"%r" needs to have a value for field "%s" before ' File "C:\Users\atifs\Documents\job_portal\jobportal-env\lib\site-packages\django\db\models\base.py", line 521, in __repr__ return '<%s: %s>' % (self.__class__.__name__, self) File "C:\Users\atifs\Documents\job_portal\jobportal\job_management\models.py", line 24, in __str__ return str(self.job_type) Exception Type: AttributeError at /create_job/ Exception Value: 'JobPost' object has no attribute 'job_type'
解决方案
- 多对多字段的
set方法要求主表对象已经存入数据库、有主键ID才能调用,你当前代码先执行set再执行save顺序颠倒,调换两行位置即可。另外set方法要求传入可迭代对象,如果你只需要关联单个用户,要么写成job_pst.job_posters.set([request.user]),要么直接用更适配单对象添加的add方法:job_pst.job_posters.add(request.user)。 - 你的
JobPost模型的__str__方法返回了不存在的job_type字段,要么在JobPost模型定义中补充job_type字段,要么修改__str__方法返回已有的字段,比如return self.title即可解决属性报错。 - 额外优化:你后续创建
Job_Skillset时先调用set再执行bulk_create的操作是无效的,bulk_create不会触发多对多字段的关联保存,你可以在bulk_create执行完成后再遍历处理多对多关联,或者直接将Job_Skillset的skill字段修改为外键(单条技能关联记录对应单个技能,不需要多对多)更合理。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

