在Django中通过外键选择相关字段

1 投票
2 回答
914 浏览
提问于 2025-04-17 11:59

我知道要选择一个相关的对象,可以使用 object.related_set.all() 这个方法。但是在我的情况下,这样做会出现一个属性错误(AttributeError),所以调试起来非常困难。下面是我的设置:

class Action(models.Model):
    ...

class FieldDiff(models.Model):
    action = models.ForeignKey(Action, editable=False, related_name='Action')

然后在一个命令行工具中:

In [16]: act = Action.objects.get(pk=34)
In [17]: act.fielddiff_set.all()
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)

/home/ipantuyev/progs/ccc_app/<ipython console> in <module>()

AttributeError: 'Action' object has no attribute 'fielddiff_set'

我想这可能和驼峰命名法的转换有关。我可以绕过这个问题,但这段代码是从模板中调用的,所以我更希望不需要额外的逻辑。

2 个回答

1

这和“从驼峰命名法翻译”没有关系。

你给你的外键(ForeignKey)设置了一个明确的 related_name 属性。这个名字是Django用来提供反向关系的。所以你的查询应该是:

act.Action.all()

其实,那个 related_name 的值没有什么意义。你应该把它去掉,这样原来的 fielddiff_set 就能正常工作了。

2

这是因为你把 related_name 设置成了 Action。这就意味着你想通过 Action_set 来访问所有和这个 Action 相关的 FieldDiff 实例。看起来这不是你想要的,所以最简单的办法就是去掉 related_name 这个参数。

撰写回答