我想要一个带有来自同一个表的2个外键的Django模型。这是一个事件表,有2列供员工使用:'actor'和'receiver'。但是我得到了这个错误:
错误:一个或多个模型未验证:tasks.task:Intermediary model TaskEvent有多个Employee的外键,即 模棱两可,不允许。
有更好的方法对此进行建模吗? 感谢
我想我要添加一个TaskEvent_to_Employee
表。其中将有两条记录,每条记录对应于与TaskEvent
相关的两名员工。有人知道更简单的解决方法吗?
答案 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