Django模型,具有来自同一表的两个外键

Django模型,具有来自同一表的两个外键,django,foreign-keys,ambiguity,Django,Foreign Keys,Ambiguity,我想要一个Django模型,同一个表中有两个外键。它是一个事件表,有两列供员工使用:actor和receiver。但我得到了这个错误: 错误:一个或多个模型未验证:tasks.task:intermediate model TaskEvent对Employee具有多个外键,即 模棱两可,是不允许的 有没有更好的方法对此进行建模? 谢谢 我想我要添加一个TaskEvent\u到\u Employee表中。其中将有两条记录,与每个TaskEvent相关的两名员工各有一条记录。有人知道一个更简单的解决

我想要一个Django模型,同一个表中有两个外键。它是一个事件表,有两列供员工使用:actor和receiver。但我得到了这个错误:

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

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


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

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

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

希望这对您有用-如果不行,我也会有问题。

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

我认为您要查找的是ForeignKeyFields上的相关\u name属性。这将允许您引用同一个表,但为关系指定django特殊名称

更多信息:


从错误消息中,听起来您试图将两个外键放在中间表上的同一对象上,该中间表通过
ManyToManyField
参数使用,该参数为:

当你设立中介机构时 模型,则显式指定外部 所涉及模型的关键点 在众多的关系中。这 显式声明定义了 两个模型是相关的

在这方面有一些限制 中间型号:

  • 您的中间模型必须包含一个且仅包含一个外键 目标模型(这将是个人 在我们的示例中)。如果你有超过 一个外键,一个验证错误 将被提出
  • 您的中间模型必须包含一个且仅包含一个外键 源模型(这将是组) 在我们的示例中)。如果你有超过 一个外键,一个验证错误 将被提出
使用的是我的解决方案:

class Sample(models.model):
    ...

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

你能提供给你这个问题的模型类吗?的可能重复肯定是一个重复,标记了它。@Blairg23你晚了9年,但继续努力。related_name不是使用“related_name”返回到包含属性的模型的链接吗,因此,在上面的示例中,您是否会将相关的_名称更改为“createe”和“assignor”,因为在您的示例中,如果有人访问对象“assigner”,他们将获得“assignor”?这是推荐的方法。这样,当您试图访问模型时,让我们将其称为
Order
。对于本例,您可以在user.objects.all()中为user说
:created_orders=user.creator.all()
,它将返回该
用户
实例的所有已创建订单。相关的\u名称应为复数