如何正确地将模型导入oscar.partner应用程序的策略模块?

时间:2016-10-24 09:15:40

标签: django django-models django-oscar

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

中所述

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

/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.3 Django 1.9.9

1 个答案:

答案 0 :(得分:0)

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

策略类在服务器启动时提前导入,某些模型尚未在当时注册。

解决方案是在导入部分中导入不在模块顶部的模块,但仅在需要模型的方法中进行安装。 (在我的情况下,这是select_stockrecord方法:

  

来自oscar.core.loading import get_class,get_model
   CountrySpecificProductInformation = get_model('catalog',   'CountrySpecificProductInformation')

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

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