使用同一应用程序中的其他Oscar模型覆盖Oscar模型

时间:2015-07-24 01:00:11

标签: django django-models python-import django-oscar

我需要达到这样的目标:

from oscar.apps.catalogue.abstract_models import AbstractProduct
from oscar.apps.catalogue.models import ProductClass

Product(AbstractProduct):
     @property
     display(self):
          if self.product_class = ProductClass.objects.get(pk=1):
               #do something
          else:
               #do something else

但是当我在其他地方from catalogue.models import Product时,我总是得到默认的奥斯卡Product,而不是我的被覆盖的Product display()属性。 我相信这是因为当我执行Product时,内置的Oscar import ProductClass正在我的自定义之前注册。

然而,为了实现我需要的功能,我必须能够在ProductClass的分叉版本中访问Product

我怎样才能绕过这个捕获22?

1 个答案:

答案 0 :(得分:1)

当重写Oscar模型时,您需要将任何非抽象导入移动到类定义之下,以便替换Oscar附带的模型。这是an example

在您的情况下,只需移动下面的models导入即可:

from oscar.apps.catalogue.abstract_models import AbstractProduct


Product(AbstractProduct):
    @property
    display(self):
        if self.product_class == ProductClass.objects.get(pk=1):
            #do something
        else:
            #do something else


from oscar.apps.catalogue.models import *

display属性将继续工作,因为第一次调用它时,模块范围已经包含所有必需的模型。

我已将导入更改为*,以确保所有其他模型都是从奥斯卡加载的。

请注意,明星导入也不可避免地会尝试导入Product模型,但奥斯卡会注意到该名称的模型已经注册,并且只会丢弃其他定义。这是丑陋和令人困惑的,但这是奥斯卡的推荐方法。