我需要达到这样的目标:
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?
答案 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
模型,但奥斯卡会注意到该名称的模型已经注册,并且只会丢弃其他定义。这是丑陋和令人困惑的,但这是奥斯卡的推荐方法。