在Django中实现批量创建时迭代列表出现TypeError: 'str' object is not callable错误
解决Django批量创建Job_Skillset时的TypeError: 'str' object is not callable
嘿,我看你在批量创建Job_Skillset数据的时候碰到了这个TypeError,咱们来一步步拆解解决它。
问题根源定位
从错误追踪信息可以明确看到,报错发生在这一行:
for job_skll, job_lvl in zip(job_skill_, job_skill_level):
错误提示'str' object is not callable,这意味着你代码里的zip已经不是咱们熟悉的那个内置迭代函数了——它被意外赋值成了一个字符串,当你尝试像调用函数一样使用zip()时,自然就触发了错误。
另一种可能是job_skill_或job_skill_level其中一个变量名和某个函数重名且被设为了字符串,但结合上下文来看,最常见的原因还是你不小心覆盖了内置的zip()函数。
具体解决方案
排查变量名冲突
去你的create_job视图函数里搜一搜,有没有类似这样的代码:zip = request.POST.get('zip_code') # 或者其他把zip赋值为字符串的操作如果有,把这个变量名改成别的(比如
user_zip_code),别和内置函数名重名。确保获取到的是列表数据
如果job_skill_和job_skill_level是从表单的多选字段或批量提交的字段来的,一定要用getlist()而不是get(),否则你拿到的只是单个字符串,而不是可迭代的列表:# 正确获取批量提交的列表数据 job_skill_ = request.POST.getlist('job_skill') job_skill_level = request.POST.getlist('job_skill_level')优化批量创建代码(可选)
你可以用生成器表达式替代列表append,让代码更简洁高效:job_skill_set = ( Job_Skillset( skill=Skillset.objects.get(skill_name=skill_name), job_post=job_pst, skill_level=level ) for skill_name, level in zip(job_skill_, job_skill_level) ) Job_Skillset.objects.bulk_create(job_skill_set)另外,建议给
Skillset.objects.get()加个异常处理,避免因为某个技能名称不存在导致整个批量创建失败:from django.core.exceptions import ObjectDoesNotExist job_skill_set = [] for skill_name, level in zip(job_skill_, job_skill_level): try: skill_set = Skillset.objects.get(skill_name=skill_name) job_skill_set.append(Job_Skillset( skill=skill_set, job_post=job_pst, skill_level=level )) except ObjectDoesNotExist: # 这里可以加日志记录,或者跳过不存在的技能 continue Job_Skillset.objects.bulk_create(job_skill_set)
总结
先检查有没有覆盖zip内置函数,再确认你获取的是列表而非单个字符串,这两步就能解决这个报错啦。
内容的提问来源于stack exchange,提问作者Atif Shafi
相关产品推荐
相关产品推荐

