Django模型与同一个表中的2个外键

时间:2009-02-24 20:00:12

标签: django foreign-keys ambiguity

我想要一个带有来自同一个表的2个外键的Django模型。这是一个事件表,有2列供员工使用:'actor'和'receiver'。但是我得到了这个错误:

  

错误:一个或多个模型未验证:tasks.task:Intermediary   model TaskEvent有多个Employee的外键,即   模棱两可,不允许。

有更好的方法对此进行建模吗? 感谢

我想我要添加一个TaskEvent_to_Employee表。其中将有两条记录,每条记录对应于与TaskEvent相关的两名员工。有人知道更简单的解决方法吗?

5 个答案:

答案 0 :(得分:74)

我还没有这样做,但我使用 inspectdb 从现有数据库中生成models.py文件,这样做就是这样 - 这就是inspectdb退回的,所以它应该工作:

creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')

希望这对你有用 - 如果不是,我也会遇到问题。

答案 1 :(得分:7)

我认为你要找的是ForeignKeyFields上的related_name属性。这将允许您引用同一个表,但为该关系提供django特殊名称。

更多信息:

答案 2 :(得分:7)

从错误消息中,您可能会尝试将两个外键放在通过through参数ManyToManyField使用的中间表上的同一个对象上,documentation for which states

  

设置中介时   model,你明确指定外来的   涉及的模型的关键   在ManyToMany关系中。这个   显式声明定义如何   两个模型是相关的。

     

有一些限制   中间模型:

     
      
  • 您的中间模型必须包含一个 - 且只有一个 - 外键   目标模型(这将是人   在我们的例子中)。如果你有超过   一个外键,验证错误   将被提出。
  •   
  • 您的中间模型必须包含一个 - 且只有一个 - 外键   源模型(这将是Group   在我们的例子中)。如果你有超过   一个外键,验证错误   将被提出。
  •   

答案 3 :(得分:1)

使用related_name是我的解决方案:

class Sample(models.model):
    ...

class Mymodel(models.model):
    example1 = models.ForeignKey(Sample, related_name='sample1')
    example2 = models.ForeignKey(Sample, related_name='sample2')

答案 4 :(得分:0)

两列是一个表的一部分这一事实意味着两个字段是相关的,因此单独引用它们并不理想。模型的ForeignKey应该是您引用的表的主键:

event = models.ForeignKey('event')

然后您将引用这些列:

foo.event.actor
foo.event.receiver

如果您希望也可以更改类/模型引用具有属性的外部属性的方式。在课堂上,您将执行以下操作:

@property
def actor(self):
  return self.event.actor
@property
def receiver(self):
  return self.event.receiver

这样你就可以调用foo.actor和foo.receiver,但我相信foo.event.actor更长,更加pythonic