【问题标题】:Django multi-table inheritance with separate (identical) tables without pointersDjango多表继承,带有单独(相同)表,没有指针
【发布时间】:2012-08-22 07:17:57
【问题描述】:

我正在继承现有模型(完全来自另一个应用程序)并希望我的模型拥有自己的数据库表。原始表的相同克隆/副本,而不仅仅是带有指向“父”表中存储的数据的指针的表。

这是我的模型:

class A (models.Model):
    name = models.CharField('name')

class MyA (A):
    class Meta:
        db_table = 'My_A'

这是我的数据库表:

CREATE TABLE A
(
  id serial NOT NULL,
  "name" character varying(50) NOT NULL,
  ...
)

CREATE TABLE My_A
(
  A_ptr_id integer NOT NULL,
  ...
)

这就是我想要的:

CREATE TABLE A
(
  id serial NOT NULL,
  "name" character varying(50) NOT NULL,
  ...
)

CREATE TABLE My_A
(
  id serial NOT NULL,
  "name" character varying(50) NOT NULL,
  ...
)

编辑:我最终复制粘贴了第 3 方模型

【问题讨论】:

  • MyAA有什么区别?
  • 真的没有。模型 A 是从另一个应用程序导入的(在我的项目中也用于它的主要用途),我想分离存储的数据。

标签: python django database django-models


【解决方案1】:

如果我对您的理解正确,您可以创建一个没有自己的表的抽象基类。然后,您可以从那里创建多个类,这些类从具有自己的表的基类继承。

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

class A(ABase):
    class Meta:
        db_table = 'A'

class MyA(ABase):
    class Meta:
        db_table = 'My_A'

Django 2.2 Documentation - Abstract base classes

【讨论】:

    【解决方案2】:

    新方法(如果您坚持分离数据):创建模型 MyA 而不从 A 继承,并创建另一个模型 MergeA,为 My 和 A 创建显式通用外键。但这肯定需要相当多的额外编码。

    【讨论】:

      【解决方案3】:

      当您继承 Django 模型时,它总是会生成与父模型的隐式 1-1 关系。 Django 只会为您继承的模型生成字段。一般来说,这对我来说完全有意义。但是对于您的用例来说很麻烦。由于我们正在讨论 Django 核心功能,因此可能很难解决。您可以尝试将您的第 3 方模型作为代理模型复制并粘贴到您的代码中,然后从那里继承。

      更新:但是为什么要将数据分成不同的表?最终目标是什么?

      【讨论】:

      • 第 3 方模型 (A) 也用于我的项目中的主要目的。而且我需要将它们分开,以便 A.objects.all() 只返回“原始”对象。我还需要运行异地计算以通过固定装置(或其他东西)定期重新填充 MyA 表,并且我不想影响模型/表 A 的生产使用。
      猜你喜欢
      • 2021-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-01-24
      • 2012-03-08
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多