3. Моделирование простого продукта
2 октября 2016 г. 11:52
В качестве простого примера в данном руководстве используется карты памяти в качестве своего первого продукта. Как подчёркивалось ранее, djangoSHOP не поставляется с готовым к использованию моделями продукта. Вместо этого продавец должен описать эти модели основанные на свойствах продукта. Давайте взглянем на модель, описывающую типичную Карту памяти:
# myshop/models/smartcard.py from shop.money.fields import MoneyField from shop.models.product import BaseProduct, BaseProductManager, CMSPageReferenceMixin from shop.models.defaults.mapping import ProductPage, ProductImage from ..manufacturer import Manufacturer class SmartCard(CMSPageReferenceMixin, BaseProduct): # common product fields product_name = models.CharField(max_length=255, verbose_name=_("Product Name")) slug = models.SlugField(verbose_name=_("Slug")) unit_price = MoneyField(_("Unit price"), decimal_places=3, help_text=_("Net price for this product")) caption = HTMLField(verbose_name=_("Caption"), configuration='CKEDITOR_SETTINGS_CAPTION', order = models.PositiveIntegerField(verbose_name=_("Sort by"), db_index=True) cms_pages = models.ManyToManyField('cms.Page', through=ProductPage,
Здесь наша модель SmartCard напрямую наследуется от BaseProduct, который является классом-заглушкой, следовательно, наиболее распространённые поля, такие как product_name, slug и unit_price должны быть добавлены здесь. Позже вы поймёте, почему эти поля, даже казалось бы требуемые для каждого продукта, не могут стать частью абстрактного класса BaseProduct.
Дополнительно карты памяти могут иметь некоторые специфические свойства:
help_text=_("Short description used in the catalog's list view of products.")) description = HTMLField(verbose_name=_("Description"), configuration='CKEDITOR_SETTINGS_DESCRIPTION', help_text=_("Description for the list view of products.")) # product properties manufacturer = models.ForeignKey(Manufacturer, verbose_name=_("Manufacturer")) CARD_TYPE = (2 * ('{}{}'.format(s, t),) for t in ('SD', 'SDXC', 'SDHC', 'SDHC II') for s in ('', 'micro ')) card_type = models.CharField(_("Card Type"), choices=CARD_TYPE, max_length=15) SPEED = ((str(s), "{} MB/s".format(s)) for s in (4, 20, 30, 40, 48, 80, 95, 280)) speed = models.CharField(_("Transfer Speed"), choices=SPEED, max_length=8)
Эти атрибуты класса в значительной степени зависят от спецификации продукта для продажи.
В заключении, мы также можем разместить наши продукты в категории и отсортировать их:
speed = models.CharField(_("Transfer Speed"), choices=SPEED, max_length=8) product_code = models.CharField(_("Product code"), max_length=255, unique=True) storage = models.PositiveIntegerField(_("Storage Capacity"), help_text=_("Storage capacity in GB")) # controlling the catalog order = models.PositiveIntegerField(verbose_name=_("Sort by"), db_index=True)
Поле order используется для сортировки продуктов во время рендера списка продуктов.
Поле cms_pages определяет на каких страницах CMS продукт должен отображаться.
Замечание: если категориям не требуется хранение каких-либо технических свойств, то часто достаточно использовать CMS страницы как категории.
И наконец, поле images, имеющие связь многие-ко-многим, позволяют ассоциировать с none, один или более изображений для продукта.
Оба поля cms_pages и images должны использовать парметр through. Потому что мы имеем две таблицы многие-ко-многим, которые являются частью проекта, а не приложением djangoSHOP. Первая из этих таблиц имеет внешние ключи на cms.Page моделей и myshop.SmartCard. Вторая таблица имеет внешние ключи на модели filer.Image и myshop.SmartCard снова. Так как модель myshop.SmartCard была объявлена самим продавцом, он также несет ответственность за управление этими таблицами со связью многие-ко-многим.
Кроме того каждая модель продукта требует следующие атрибуты:
- Поле или метод, названное product_name: Должен вернуть название продукта в его естественном языке.
- Метод get_price(request): Возвращает стоимость продукта. Она может зависеть от данного региона, который доступен через объект request.
- Метод get_absolute_url(): Возвращает канонический URL продукта.
- Атрибут объекта должен быть типа BaseProductManager или производным от него.
Следующие атрибуты модели продукта - опциональны, но очень рекомендуемы:
- Поле или метод, названное product_code: Будет возвращать независимый от языка код продукта (артикул).
- Метод sample_image: Будет возвращать изображение данного продукта.
3.1. Добавление модели myshop.SmartCard в Django Admin
По причинам, которые были только что объяснены, что ответственность проекта для управления отношениями многие-ко-многим между его CMS страницами и изображениями находятся на одной стороне, а продукт - на другой стороне. Поэтому мы не можем использовать встроенный администратора виджетов FilteredSelectMultiple для этих отношений.
Вместо этого djangoSHOP поставляется со специальным классом CMSPageAsCategoryMixin, который обрабатывает связь между CMS страниц и продуктом. Этот миксин работает с полем cms_pages.
from adminsortable2.admin import SortableAdminMixin from shop.admin.product import CMSPageAsCategoryMixin, ProductImageInline from myshop.models import SmartCard @admin.register(SmartCard) class SmartCardAdmin(SortableAdminMixin, CMSPageAsCategoryMixin, admin.ModelAdmin): fieldsets = ( (None, { 'fields': ('product_name', 'slug', 'product_code', 'unit_price', 'active', 'description',), }), (_("Properties"), { 'fields': ('manufacturer', 'storage', 'card_type', 'speed',) }), ) inlines = (ProductImageInline,) prepopulated_fields = {'slug': ('product_name',)} list_display = ('product_name', 'product_code', 'unit_price', 'active',) search_fields = ('product_name',)
Для изображений класс admin должен использовать специальный inline класс ProductImageInline. Это так, потому что продавец может потребовать установить порядок изображений и поэтому простой SelectMultiple виджет не будет выполнять эту задачу.
Для расширения нашего простого продукта для поддержки других естественных языков возможно путем моделирования Многоязычного продукта (Multilingual Product).
Представляю вашему вниманию книгу, написанную моим близким другом Максимом Макуриным: Секреты эффективного управления ассортиментом.
Книга предназначается для широкого круга читателей и, по мнению автора, будет полезна специалистам отдела закупок и логистики, категорийным и финансовым менеджерам, менеджерам по продажам, аналитикам, руководителям и директорам, в компетенции которых принятие решений по управлению ассортиментом.
Комментарии: 0