60

我想要一个 Django 模型,它具有来自同一个表的 2 个外键。这是一个事件表,有 2 列供员工使用:“演员”和“接收者”。但我得到这个错误:

错误:一个或多个模型未验证:tasks.task:中间模型 TaskEvent 对 Employee 有多个外键,这是不明确且不允许的。

有没有更好的方法来建模这个?

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

4

5 回答 5

113

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

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

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

于 2009-02-24T20:03:41.957 回答
9

我认为您正在寻找的是 ForeignKeyFields 上的 related_name 属性。这将允许您引用同一个表,但为关系赋予 django 特殊名称。

更多信息:

于 2009-02-25T08:02:29.810 回答
7

从错误消息中,听起来您正试图将两个外键放在通过through参数 to使用的中间表上的同一个对象上ManyToManyField,其中的文档指出

设置中间模型时,您明确指定多对多关系中涉及的模型的外键。这个明确的声明定义了这两个模型是如何相关的。

中间模型有一些限制:

  • 您的中间模型必须包含一个 - 并且只有一个 - 目标模型的外键(在我们的示例中是 Person)。如果您有多个外键,则会引发验证错误。
  • 您的中间模型必须包含一个 - 并且只有一个 - 源模型的外键(在我们的示例中为 Group)。如果您有多个外键,则会引发验证错误。
于 2009-02-25T11:17:11.697 回答
4

使用related_name是我的解决方案:

class Sample(models.model):
    ...

class Mymodel(models.model):
    example1 = models.ForeignKey(Sample, related_name='sample1')
    example2 = models.ForeignKey(Sample, related_name='sample2')
于 2018-11-20T04:37:35.160 回答
-2

两列是一个表的一部分这一事实意味着这两个字段是相关的,因此单独引用它们并不理想。您的模型的 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

于 2009-02-24T20:19:46.893 回答