Шаблоны дизайна Django для основных моделей - PullRequest
4 голосов
/ 07 февраля 2012

Я работаю над структурой электронной коммерции для Django.Главная цель разработки - предоставить минимальные функциональные возможности с точки зрения моделей и представлений, вместо этого позволяя пользователям библиотеки расширять или заменять компоненты своими собственными.

Причина этого заключается в том, что попытки разработкиуниверсальное решение для электронной коммерции приводит к чрезмерно сложному коду, который зачастую далек от оптимального.

Один из подходов к решению этой проблемы, по-видимому, заключается в использовании инверсии контроля, либо через файл настроек Djangoили импортировать хаки, но я столкнулся с небольшой проблемой из-за того, как Django регистрирует свои модели.

Среда электронной коммерции предоставляет набор абстрактных моделей, а также конкретные версии в {app_label} /models.py.Представления используют функцию get_model(app_label,model) Джанго для возврата класса модели без необходимости жесткого кодирования ссылки.

У этого подхода есть некоторые проблемы:

  1. Пользователи должныимитируйте структуру приложений фреймворка, то есть app_label, и эффективно заменяйте нашу версию приложения своими

  2. Из-за того, как работает сайт администратора, ищите admin.py в каждомУстановленное приложение, они должны имитировать или явно импортировать классы администрирования фреймворка, чтобы использовать их.Но, импортируя их, вызывается метод register, поэтому они должны быть незарегистрированными, если пользователь хочет их настроить.

  3. Пользователь должен быть чрезвычайно осторожным при импорте конкретных моделей изосновные рамки.Это связано с тем, что метакласс базовой модели Django автоматически регистрирует модель в кеше приложения, как только читается определение класса (т. Е. После __new__), и первая модель, зарегистрированная с определенной меткой, - это та, с которой вы застряли.Таким образом, вы должны определить все ваши модели переопределения, прежде чем импортировать любую из основных моделей.Это означает, что вы в конечном итоге попадаете в грязную ситуацию с кучей импортов внизу ваших модулей, а не сверху.

Я думаю пойти дальше вниз по инверсии контролякроличья нора:

  1. Все ссылки на основные компоненты (модели, виды, администратор и т. д.) заменены вызовами в контейнер IoC

  2. Для всехмодели ядра (платформа электронной коммерции) замените использование метакласса базовой модели Django на тот, который не регистрирует модели автоматически, а затем попросите контейнер явно зарегистрировать их при запуске.

Мой вопрос:

Есть ли лучший способ решить эту проблему?Цель состоит в том, чтобы упростить настройку фреймворка и переопределить функциональность без необходимости изучать множество раздражающих приемов.Похоже, ключ к моделям и сайту администратора.

Я ценю, что использование контейнера IoC не является распространенным явлением в мире Django, поэтому я хочу избежать его, если это возможно, но похоже, чтоправильное решение.

1 Ответ

1 голос
/ 14 февраля 2012

Вы смотрели на код из других проектов с похожим подходом?Не уверен, что этот способ соответствует вашим потребностям, но, на мой взгляд, стоит обратить внимание на код django-shop .

Эта структура предоставляет базовую логику, позволяя вам предоставлять собственную логику там, где это необходимо.

настройка с помощью моделей

например, см. productmodel.py

#==============================================================================
# Extensibility
#==============================================================================
PRODUCT_MODEL = getattr(settings, 'SHOP_PRODUCT_MODEL',
    'shop.models.defaults.product.Product')
Product = load_class(PRODUCT_MODEL, 'SHOP_PRODUCT_MODEL')

настройка с помощью логики / URL

например, см. simplevariation-plugin магазина Расширяет логику корзины, поэтому подключается через urlpattern:

(r'^shop/cart/', include(simplevariations_urls)),
(r'^shop/', include(shop_urls)),

и расширяет представления: ...

from shop.views.cart import CartDetails

class SimplevariationCartDetails(CartDetails):
    """Cart view that answers GET and POSTS request."""
...

Фреймворк предоставляет несколько точек для подключения, упомянутый выше плагин simplevariation дополнительно предоставляет модификатор cart:

SHOP_CART_MODIFIERS = [
    ...
    'shop_simplevariations.cart_modifier.ProductOptionsModifier',
    ...
]

Я беспокоюсь, что это объяснение не очень понятно, трудно кратко изложить этоконцепция.Но взгляните на проект django-shop и некоторые его расширения: экосистема

...