Django反向关联查询报错:Prjdesc对象无experience属性
Django外键反向关联报错问题
我是Django新手,正在跟随官方教程练习Models模块,同时自己创建了一个项目应用相关概念。以下是我的models.py代码:
from django.db import models class Experience(models. Model): o01_position = models.CharField(max_length=50) o02_year_in = models.DateField(null=True) o03_year_out = models.DateField(null=True) o04_project = models.CharField(max_length=100) o05_company = models.CharField(max_length=50) o06_location = models.CharField(max_length=50) def __str__(self): return self.o01_position} class Prjdesc(models.Model): o00_key = models.ForeignKey( Experience, on_delete=models.CASCADE) o07_p_desc = models.CharField(max_length=250) def __str__(self): return self.o07_p_desc class Jobdesc(models.Model): o00_key = models.ForeignKey(Experience, on_delete=models.CASCADE) o08_job_desc = models.CharField(max_length=250) def __str__(self): return self.o08_job_desc
在Python/Django Shell中执行以下命令可正常获取关联数据:
>>> x = Experience.objects.get( pk = 2 ) >>> x <Experience: Head Office Technical Office Manager>
以下两条命令也可正常执行:
>>> y = Prjdesc.objects.get( pk = 11 ) >>> y <Prjdesc: Description 1> >>> x.prjdesc_set.all() <QuerySet [<Prjdesc: Description 1>, <Prjdesc: Description 2>]>
但执行y.experience时出现报错:
>>> y.experience Traceback (most recent call last): File "<console>", line 1, in <module> AttributeError: 'Prjdesc' object has no attribute 'experience'
该语句本应返回关联的Experience记录,请问我遗漏了什么?
问题原因与解决办法
你报错的核心原因是:从子模型(Prjdesc)反向关联父模型(Experience)时,必须使用外键字段的实际名称,而不是父模型类名的小写形式。你在Prjdesc里定义的外键字段是o00_key,所以正确的调用方式是:
>>> y.o00_key
这样就能直接返回关联的Experience实例。
如果想让反向关联使用experience这种更直观的名称,可以在定义ForeignKey时添加related_name参数:
# 修改Prjdesc的外键定义 o00_key = models.ForeignKey( Experience, on_delete=models.CASCADE, related_name='experience')
修改后执行makemigrations和migrate命令更新数据库,之后就能用y.experience获取关联的Experience记录了。
另外你的代码里还有两个小错误建议修正:
Experience类定义时,models. Model中间多了空格,应改为models.ModelExperience的__str__方法里,return self.o01_position}多了一个右大括号,应改为return self.o01_position
内容的提问来源于stack exchange,提问作者BlueHawk77
相关产品推荐
相关产品推荐

