【问题标题】:Model name conflict while Extending Django Oscar?扩展 Django Oscar 时模型名称冲突?
【发布时间】:2015-08-17 13:08:33
【问题描述】:

我正在尝试扩展 Oscar 应用程序,所以我分叉了它。现在跟随this example 一行又一行的尝试向ProductImage Model 类添加一个字段。

from oscar.apps.catalogue.abstract_models import AbstractProductImage    
class ProductImage(AbstractProductImage):
        thumbnail = models.ImageField(upload_to='images/thumbnails/')
from oscar.apps.catalogue.models import * 

runserver 我得到错误

RuntimeError: Conflicting 'productimage' models in application 
'catalogue': <class 'oscar.apps.catalogue.models.ProductImage'> 
and <class 'forked_apps.catalogue.models.ProductImage'>.

我知道如果我将 ProductImage 类的名称更改为其他名称,这将起作用,但为什么在示例中它们使用相同的名称呢?同样在未来假设我想分叉任何我想将字段添加到现有类而不是新类的应用程序。有什么我想念的吗?

【问题讨论】:

  • 既然你已经fork了这个项目,你就可以修改其中的任何代码了。无需将其视为不可变框架,仅从基类继承。只需修改ProductImage的源代码即可。
  • 如果我想向现有模型添加字段怎么办。我不想制作新模型,因为我将不得不进行数据迁移。我不能只是扩展现有模型还是不可能的?
  • 新字段必须存储在数据库表中,因此无论是否制作新模型,迁移都是不可避免的。除非该字段可以从其他字段计算,并且不需要存储。
  • 字段迁移我了解。假设当前Product 模型拥有我所有的对象。现在我想向Product 模型添加一个字段,我该怎么做?如果我将扩展类命名为Product,它将引发错误。如果我把名字改成NewProduct 我会丢失Product 类的所有数据吗?你明白我在说什么吗?

标签: python django django-oscar


【解决方案1】:

当您用自己的覆盖替换 oscar.apps.catalogue 时,请确保从 INSTALLED_APPS 列表中删除它。特别是如果您调用 get_core_apps(),请确保在您提供给函数的列表中包含 forked_apps.catalogue

如果不这样做可能会导致 Django 在加载您的覆盖之前加载 Oscar 的模型,这会导致重复(和错误)。

【讨论】:

【解决方案2】:

如果我不从oscar.apps.catalogue.models 导入任何东西,那么这些模型没有注册,因此我不会看到冲突。我正在从中导入模型(问题中未显示),因此我遇到了冲突。

【讨论】:

  • 隐藏在他们的文档中的是警告,例如from oscar.apps.catalogue.models import * 应该在定义你的覆盖之后完成。
猜你喜欢
  • 1970-01-01
  • 2010-11-05
  • 1970-01-01
  • 2021-12-13
  • 2016-11-09
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多