Django同文件内模型引用报错:‘Job’未定义,需特定顺序?
Django模型关联顺序问题:"Job" is not defined 报错解决
问题描述
在Django开发中,为CandidatesApplied模型设置关联下方Job模型的外键时,出现报错"Job" is not defined,但Job模型就在同一文件的该模型下方。疑问:同一文件中定义模型关系时,Django是否要求特定顺序?
相关代码
class CandidatesApplied(models.Model): job = models.ForeignKey(Job, on_delete=models.CASCADE) user = models.ForeignKey(User, on_delete=models.SET_NULL, null = True) resume = models.CharField(max_length=200) appliedAt = models.DateTimeField(auto_now_add=True, null=True) coverLetter = models.CharField(max_length=3000, null=True) class Meta: default_related_name = 'candidates_applied' class Job(models.Model): title = models.CharField(max_length=200, null=True) description = RichTextField(blank=True, null=True) email = models.EmailField(null=True) featured = models.BooleanField(default=False, auto_created=False) expiredAt = models.DateField(default=date.today, auto_now=False) address = models.CharField(max_length=100, null=True) job_country = models.JSONField(null=True) job_facebook = models.CharField(max_length=100, null=True) job_twitter = models.CharField(max_length=100, null=True) job_state = models.JSONField(null=True) jobType = ArrayField(models.JSONField()) education = models.CharField( max_length=100, choices=Education.choices, default=Education.Bachelors ) job_city = models.JSONField(null=True) industry = models.CharField( max_length=100, choices=Industry.choices, default=Industry.Business ) experience = models.CharField( max_length=100, choices=Experience.choices, default=Experience.NO_EXPERIENCE ) minSalary = models.IntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(1000000)]) maxSalary = models.IntegerField(default=1, validators=[MinValueValidator(1), MaxValueValidator(1000000)], null=True) positions = models.IntegerField(default=1) company = models.ForeignKey(Company, on_delete=models.CASCADE, null=True) responsibilities = RichTextField(blank=True, null=True) skills = RichTextField(blank=True, null=True) lat = models.DecimalField(max_digits=9, decimal_places=6, null=True) long = models.DecimalField(max_digits=9, decimal_places=6, null=True) user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True) createdAt = models.DateTimeField(auto_now_add=True, null=True) startAt = models.DateField(null=True, default=datetime.date.today) weeklyHours = models.DecimalField(max_digits=4, decimal_places=2, null=True, default=0.00) isActive = models.BooleanField(default=True, auto_created=True) appliedApplicants = models.ForeignKey(CandidatesApplied, on_delete=models.CASCADE, null=True)
解答
1. 顺序要求的本质
Python是从上到下逐行解析代码的,当Django解析CandidatesApplied模型时,下方的Job类还未被定义,自然会抛出未定义的错误。所以同一文件内定义模型时,默认要求被关联的模型必须先定义。
2. 解决方法
方法一:调整模型定义顺序
把Job模型移到CandidatesApplied模型上方,这样解析CandidatesApplied时,Job已经存在:
class Job(models.Model): # Job模型的所有字段... class CandidatesApplied(models.Model): job = models.ForeignKey(Job, on_delete=models.CASCADE) # 其他字段...
方法二:使用字符串引用模型
如果不想调整顺序,可以把外键关联的模型名用字符串形式传递,Django会在所有模型加载完成后再解析这个引用:
class CandidatesApplied(models.Model): job = models.ForeignKey('Job', on_delete=models.CASCADE) # 其他字段... class Job(models.Model): # Job模型的所有字段...
这种方式尤其适合处理循环关联的场景(比如你的代码里Job也关联了CandidatesApplied),避免互相依赖导致的定义顺序问题。
3. 额外注意:循环关联的处理
你的代码里Job模型有appliedApplicants = models.ForeignKey(CandidatesApplied, on_delete=models.CASCADE, null=True),这就形成了循环关联。此时更推荐用字符串引用,或者确保其中一方用字符串,同时设置合理的null=True避免迁移报错。
内容的提问来源于stack exchange,提问作者Edward
相关产品推荐
相关产品推荐

