如何正确导入模型到 oscar.partner 应用的策略模块?

how to import models to oscar.partner app's strategy module correctly?

我已将自己的策略定义为 Select 股票和价格,如 http://django-oscar.readthedocs.io/en/releases-1.1/topics/prices_and_availability.html

中所述

一切正常,直到我需要导入我在目录应用程序中创建的自定义模型 class。 我的目标是为价格选择策略访问此自定义模型。

/apps/partner/strategy 我尝试像这样导入模型:

CountrySpecificProductInformation = get_model('catalogue', 'CountrySpecificProductInformation')

此调用引发模型未注册异常:

  File "/home/matyas/virtenvs/oscar/local/lib/python2.7/site-packages/oscar/core/loading.py", line 250, in get_model
    return apps.get_registered_model(app_label, model_name)
  File "/home/matyas/virtenvs/oscar/local/lib/python2.7/site-packages/django/apps/registry.py", line 260, in get_registered_model
    "Model '%s.%s' not registered." % (app_label, model_name))
LookupError: Model 'catalogue.CountrySpecificProductInformation' not registered.

我的已安装应用程序设置如下所示:

INSTALLED_APPS = ['...'] +
 oscar.get_core_apps(['apps.catalogue', 'apps.promotions', 'apps.dashboard',
                             'apps.dashboard.catalogue', 'apps.partner', 'apps.payment', 'apps.dashboard.partners',
                             'apps.shipping', 'apps.checkout', 'apps.search'])

我正在使用 django-oscar 1.3Django 1.9.9

Oscar 有自己的导入系统,能够覆盖电子商务解决方案的任何应用程序的任何部分。

策略class在服务器启动的时候很早就导入了,当时有些模型还没有注册。

解决方案是不在导入部分的模块顶部导入模块,而是仅在需要模型的方法中导入。 (在我的例子中是 select_stockrecord 方法:

from oscar.core.loading import get_class, get_model
CountrySpecificProductInformation = get_model('catalogue', 'CountrySpecificProductInformation')

def select_stockrecord(self, product):
    CountrySpecificProductInformation = get_model('catalogue', 'CountrySpecificProductInformation')
    Country = get_model('catalogue', 'Country')

这不是一个完美的解决方案,但我更喜欢这个,而不是将原始 sql 查询直接写入数据库。