#django #django-models #django-oscar
#django #django-модели #django-oscar
Вопрос:
Я определил, объявил свою собственную стратегию выбора акции и цены, как описано в http://django-oscar.readthedocs.io/en/releases-1.1/topics/prices_and_availability.html
Все работало нормально, пока у меня не возникла необходимость импортировать пользовательский класс модели, который я создал в приложении catalogue. Моей целью было получить доступ к этой пользовательской модели для стратегии выбора цены.
в /apps/partner/strategy
я попытался импортировать модель следующим образом:
CountrySpecificProductInformation = get_model('catalogue', 'CountrySpecificProductInformation')
этот вызов вызывает исключение Model not Registered:
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:
У Oscar есть своя собственная система импорта, которая необходима для перезаписи любой части любого приложения решения для электронной коммерции.
Класс strategy импортируется на ранней стадии при запуске сервера, и некоторые модели на тот момент еще не зарегистрированы.
Решение состояло в том, чтобы импортировать модуль не в верхней части модуля в разделе импорта, а установить только в том методе, где модели необходимы. (В моем случае это был метод select_stockrecord:
из oscar.core.loading импортируйте get_class, get_model
Информация о конкретной стране = get_model(‘catalogue’, ‘Информация о конкретной стране’)
def select_stockrecord(self, product):
CountrySpecificProductInformation = get_model('catalogue', 'CountrySpecificProductInformation')
Country = get_model('catalogue', 'Country')
Это не идеальное решение, но я предпочитаю это, а не писать необработанные sql-запросы непосредственно в базу данных.