使用同一应用程序中的其他 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 会注意到该名称的模型已经注册,并且会简单地丢弃其他定义。丑陋且令人困惑,但这是奥斯卡推荐的方法。
我需要实现这样的目标:
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
.
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 会注意到该名称的模型已经注册,并且会简单地丢弃其他定义。丑陋且令人困惑,但这是奥斯卡推荐的方法。