0

我需要实现这样的目标:

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,而不是我Productdisplay()财产。我相信这是因为Product当我做import ProductClass.

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

我怎样才能绕过这个catch-22?

4

1 回答 1

1

当覆盖 Oscar 模型时,您需要将任何非抽象导入移动到旨在替换 Oscar 附带的模型的类定义下方。这是一个例子

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 会注意到该名称的模型已经注册,并且会简单地丢弃其他定义。这是丑陋和令人困惑的,但这是奥斯卡推荐的方法。

于 2015-08-13T09:24:01.870 回答