【问题标题】:How to reference two ForeignKeys in one model如何在一个模型中引用两个 ForeignKey
【发布时间】:2014-03-28 09:40:44
【问题描述】:

我想完成以下工作: 我有三个派生自抽象类的类:

class Person(models.Model):
  name = models.CharField()
  ...
  class Meta:
    abstract = True

class TypA(Person):
  ...

class TypB(Person):
  ...

class TypC(Person):
  ...

在另一个类中,我想引用 TypA 和 TypB 作为外键,如下所示:

class Project(models.Model):
  worker = models.ForeignKey(TypA or TypB)

由于不可能将两个不同的模型声明为外键,因此我正在寻找解决方案。 我读到了通用外键;但我不确定如何将其应用于我的模型。

另一个想法是对 ForeignKeys 使用 limit_choices_to 声明。

worker = models.ForeignKey(Person, limit_choices_to={??})

但这似乎是不可能的:

Field defines a relation with model 'Person', which is either not installed, or is abstract.

提前感谢您的帮助。

【问题讨论】:

  • 人为什么是抽象的?他们为什么不直接继承它作为普通模型?
  • 因为没有人本身;只是特殊类型的人,这就是为什么我也想在数据库中映射它。
  • 但是您仍然可以将其保留为普通类并将其用作外键。然后您可以通过TypATypB 访问它
  • 好吧,假设我把它作为一个普通的类:如何在另一个类(项目)中结合 TypA 和 TypB 而不是 TypC?
  • 据我所知,您需要在代码中处理这个问题。

标签: python django generic-foreign-key


【解决方案1】:

Django ForeignKey 字段转换为数据库外键。您的 Person 模型是抽象的,因此数据库中不存在一个模型,因此该模型没有外键。

同样,一个数据库外键只能引用一个表,不能引用两个。

如果你真的想要与不止一种表的灵活关系,我看到的唯一可能是 Django 的contenttypes framework

您还想限制可以指向的模型种类。为此,您最好以 How can I restrict Django's GenericForeignKey to a list of models? 为例。

【讨论】:

    【解决方案2】:

    您只需要引用您的抽象类(如 JAVA):

    class Project(models.Model):
        worker = models.ForeignKey(Person)
    
    
    #in your code:
    worker = TypeA()
    worker.save()
    proj = Project()
    proj.worker = worker
    proj.save()
    

    【讨论】:

    • 遗憾的是,这是不可能的,因为此错误消息表明:Field defines a relation with model 'Person', which is either not installed, or is abstract.
    猜你喜欢
    • 2022-07-28
    • 2022-06-29
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多