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