我想要一个 Django 模型,它具有来自同一个表的 2 个外键。这是一个事件表,有 2 列供员工使用:“演员”和“接收者”。但我得到这个错误:
错误:一个或多个模型未验证:tasks.task:中间模型 TaskEvent 对 Employee 有多个外键,这是不明确且不允许的。
有没有更好的方法来建模这个?
我想我要添加一个TaskEvent_to_Employee
表。其中将有两条记录,一条用于与每个 相关的两名员工中的每一个TaskEvent
。有谁知道更简单的解决方法?
我想要一个 Django 模型,它具有来自同一个表的 2 个外键。这是一个事件表,有 2 列供员工使用:“演员”和“接收者”。但我得到这个错误:
错误:一个或多个模型未验证:tasks.task:中间模型 TaskEvent 对 Employee 有多个外键,这是不明确且不允许的。
有没有更好的方法来建模这个?
我想我要添加一个TaskEvent_to_Employee
表。其中将有两条记录,一条用于与每个 相关的两名员工中的每一个TaskEvent
。有谁知道更简单的解决方法?
我还没有这样做,但是我使用了 inspectdb从一个现有的数据库生成 models.py 文件,这正是这个数据库 - 这是 inspectdb 退回的,所以它应该可以工作:
creator = models.ForeignKey(Users, null=True, related_name='creator')
assignee = models.ForeignKey(Users, null=True, related_name='assignee')
希望这对你有用——如果不是,我也会有问题。
我认为您正在寻找的是 ForeignKeyFields 上的 related_name 属性。这将允许您引用同一个表,但为关系赋予 django 特殊名称。
更多信息:
从错误消息中,听起来您正试图将两个外键放在通过through
参数 to使用的中间表上的同一个对象上ManyToManyField
,其中的文档指出:
设置中间模型时,您明确指定多对多关系中涉及的模型的外键。这个明确的声明定义了这两个模型是如何相关的。
中间模型有一些限制:
- 您的中间模型必须包含一个 - 并且只有一个 - 目标模型的外键(在我们的示例中是 Person)。如果您有多个外键,则会引发验证错误。
- 您的中间模型必须包含一个 - 并且只有一个 - 源模型的外键(在我们的示例中为 Group)。如果您有多个外键,则会引发验证错误。
使用related_name是我的解决方案:
class Sample(models.model):
...
class Mymodel(models.model):
example1 = models.ForeignKey(Sample, related_name='sample1')
example2 = models.ForeignKey(Sample, related_name='sample2')
两列是一个表的一部分这一事实意味着这两个字段是相关的,因此单独引用它们并不理想。您的模型的 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