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

Override Oscar models using other Oscar models from the same app

我需要实现这样的目标:

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 时,我总是得到默认的 Oscar Product 而不是我用 display() 属性 覆盖的 Product。 我相信这是因为当我执行 import ProductClass.

时,内置 Oscar Product 在我的自定义 Oscar 之前被注册了

然而,为了实现我需要的功能,我必须在 Product!

的分叉版本中访问 ProductClass

我怎样才能绕过这个第 22 条军规?

覆盖 Oscar 模型时,您需要将任何非抽象导入移动到 class 定义下方,这些定义旨在替换 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 属性 将继续工作,因为在第一次调用它时,模块作用域已经包含所有必要的模型。

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

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