You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.Model
  • Experience的__str__方法里,return self.o01_position}多了一个右大括号,应改为return self.o01_position

内容的提问来源于stack exchange,提问作者BlueHawk77

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 23:10:31