当前位置: 首页 > 面试题库 >

使用Django South从具体继承过渡到抽象继承

淳于健
2023-03-14
问题内容

我有一个现有的Django项目,该项目具有几个使用基类的具体继承的模型。经过仔细考虑,并阅读了诸如Jacob Kaplan-
Moss之类的人所说的话,在我看来,使用这种具体的继承是不必要的。我想迁移为使用抽象基类。

使事情变得复杂的是,我的站点处于活动状态,并且用户输入了数据。因此,在整个过渡过程中,我需要保持所有数据不变。

我将举一个具体的例子:

之前:

app1 / models.py:

class Model1(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

app2 / models.py:

class Model2(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

base_app / models.py:

class BaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)

后:

app1 / models.py:

class Model1(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

app2 / models.py:

class Model2(base_app.models.BaseModel):
    field1 = models.CharField(max_length=1000)
    field2 = models.CharField(max_length=1000)

base_app / models.py:

class BaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)

    class Meta:
        abstract = True

现在,我的计划是先将添加abstract = True到BaseModel。然后,对于每个使用的模型,一次使用BaseModel一个:

  • 使用south来迁移数据库并使用–auto标志创建此迁移
  • 使用南方数据迁移。例如,我将遍历Model1中的每个对象,以在BaseModel中获取具有相同pk的对象,并将BaseModel对象的每个字段的值复制到Model1对象。

那么首先,这行得通吗?其次,还有更好的方法吗?

更新:

我的最终解决方案在此处详细介绍:

http://www.markliu.me/2011/aug/23/migrating-a-django-postgres-db-from-
concrete-inhe/


问题答案:
  1. 添加NewBaseModel,我们使用不同的名称,因此它不会与当前的非抽象名称冲突(South实际上会删除BaseModel)。

    class NewBaseModel(models.Model):
    user = models.ForeignKey(User)
    another_field = models.CharField(max_length=1000)
    
    class Meta:
        abstract = True
    
  2. 将Model1和Model2设置为继承自NewBaseModel

  3. 运行schemamigration –auto,将向Model1和Model2添加2个新字段

  4. 运行datamigration –empty并从BaseModel中的值填充新字段
  5. 加载生产数据库并仔细检查所有已正确迁移的内容
  6. 删除BaseModel并将NewBaseModel重命名为BaseModel
  7. 运行schemamigration –auto(这 应该 工作;))
  8. 部署!

注意:迁移以使用模型架构的当前状态时,请使用 orm 变量



 类似资料:
  • 继承一个可以实现的普通超类有什么不同吗? atm我有一个名为的抽象类,我有/扩展这个。 abstractcar中的一个字段设置为"私有int容量" 但是在子类“小型汽车”中,当我输入“容量”作为构造函数中使用的变量时,它说“容量在抽象汽车中有私有访问” 我想: > 子类继承超类的所有字段和方法? 我现在该怎么进行?

  • 问题内容: 我可以以某种方式在抽象类上对一组注释进行分组,并且扩展该类的每个类都已自动分配了这些注释? 至少以下情况不起作用: 问题答案: 答案是不 除非注释类型具有@Inherited元注释,否则不会继承Java注释:https : //docs.oracle.com/javase/7/docs/api/java/lang/annotation/Inherited.html。 Spring的注释

  • 我能以某种方式将一组注释分组到一个抽象类上,并且每个扩展该类的类都自动分配了这些注释吗? 至少以下内容不起作用:

  • 我有一个抽象类,这个类是在她的子类中扩展的: < li >我在这个抽象类上实现了一个方法,并抽象了另一个方法 < li >实现的方法是每个子类对象都必须访问的通用方法。所以我决定在抽象类上实现它,避免在每个子类上实现相同的方法。 小例子: 我想听听你对这种实施方式的看法, 问候。

  • 问题内容: 您将如何在以下示例代码中配置注释?我只想保留JPA注释,避免使用Hibernate特定的依赖项。 下面的代码正确吗? (这些类将具有多个版本,RefSomeOtherExample等,并且每个类一个db表。有些可能会添加其他字段(列),但大多数只会使用继承自“ RefData”基类的基本字段。) 基类: 最终,我想使用Hibernate的SchemaExport类从中生成模式创建脚本。

  • 我的代码: 问题:“

  • 问题内容: 我有六个类,它们都扩展了相同的抽象类。抽象类具有一个静态变量,该静态变量指向一些JNI代码,我只希望在每个类实例化时加载一次。 据我了解,这将导致实例化此静态变量的一个实例,但是我想要的是每个扩展类都具有自己的变量静态实例,该实例对于给定的子类是唯一的。我想在我的抽象类中编写一些代码来修改和/或释放该抽象类。是否可以同时执行这两项操作? 例如,我可以编写一个抽象类栏,其中包含变量foo

  • 我有一个关于JPA中继承的问题,是否可以使用JOINED策略来实现这个层次结构? 这是我的代码: 在上面的层次结构之后,我尝试使用JPQL进行查询,这是查询: 此代码从主代码运行 当我运行该查询时,会抛出以下错误 导致原因:com . MySQL . JDBC . exceptions . JDBC 4 . MySQL syntaxerrorexception:未知列“employee1_。“字段