Django-Shop 教程:智能卡产品模型详解
前言
在电子商务系统开发中,产品模型的设计是核心环节之一。本文将深入讲解如何在 Django-Shop 框架中实现智能卡(Smart Card)产品模型,包括基础模型构建、国际化支持以及后台管理配置。
产品模型基础设计
Django-Shop 采用灵活的产品模型设计理念,不预设产品属性,而是由开发者根据实际业务需求定义。这种设计使得框架能够适应各种不同类型的产品。
智能卡模型示例
from django.db import models
from shop.models.product import BaseProduct, BaseProductManager, CMSPageReferenceMixin
from shop.money.fields import MoneyField
class SmartCard(CMSPageReferenceMixin, BaseProduct):
product_name = models.CharField(max_length=255, verbose_name="产品名称")
slug = models.SlugField(verbose_name="URL标识")
caption = models.TextField("简短描述", help_text="用于产品列表视图的简短描述")
description = models.TextField("详细描述", help_text="用于产品详情页的长描述")
order = models.PositiveIntegerField("排序", db_index=True)
unit_price = MoneyField("单价", decimal_places=3, help_text="产品净价")
card_type = models.CharField("卡类型", choices=[(t, t) for t in ('SD', 'SDXC', 'SDHC', 'SDHC II')], max_length=9)
product_code = models.CharField("产品编码", max_length=255, unique=True)
storage = models.PositiveIntegerField("存储容量(GB)", help_text="以GB为单位的存储容量")
class Meta:
verbose_name = "智能卡"
verbose_name_plural = "智能卡"
ordering = ['order']
lookup_fields = ['product_code__startswith', 'product_name__icontains']
objects = BaseProductManager()
def get_price(self, request):
return self.unit_price
def __str__(self):
return self.product_name
@property
def sample_image(self):
return self.images.first()
关键设计要点
-
继承结构:
BaseProduct
:所有产品模型的基类CMSPageReferenceMixin
:提供CMS页面关联功能
-
核心字段:
- 产品特有属性:卡类型、存储容量等
- 电商通用字段:价格、产品编码等
- CMS相关字段:slug、排序等
-
价格处理:
- 使用
get_price()
方法而非固定字段,便于实现动态定价 MoneyField
专门处理货币金额
- 使用
-
搜索优化:
lookup_fields
定义搜索字段- 支持产品编码前缀和产品名称模糊搜索
国际化支持
对于多语言电商平台,产品模型的国际化至关重要。Django-Shop 结合 django-parler 实现多语言支持。
国际化模型实现
from parler.managers import TranslatableManager, TranslatableQuerySet
from polymorphic.query import PolymorphicQuerySet
class ProductQuerySet(TranslatableQuerySet, PolymorphicQuerySet):
pass
class ProductManager(BaseProductManager, TranslatableManager):
queryset_class = ProductQuerySet
def get_queryset(self):
qs = self.queryset_class(self.model, using=self._db)
return qs.prefetch_related('translations')
class SmartCard(CMSPageReferenceMixin, TranslatableModelMixin, BaseProduct):
caption = TranslatedField()
description = TranslatedField()
class SmartCardTranslation(TranslatedFieldsModel):
master = models.ForeignKey(SmartCard, related_name='translations', null=True)
caption = models.TextField("简短描述", help_text="用于产品列表视图的简短描述")
description = models.TextField("详细描述", help_text="用于产品详情页的长描述")
class Meta:
unique_together = [('language_code', 'master')]
国际化设计要点
-
翻译字段选择:
- 通常翻译产品描述等文本内容
- 产品编码等唯一标识不需翻译
-
性能优化:
- 使用
prefetch_related
预加载翻译 - 确保查询效率
- 使用
-
灵活性:
- 可根据需要选择翻译字段
- 保留非翻译字段的原始值
后台管理配置
完善的后台管理是电商系统的重要组成部分。Django-Shop 提供了丰富的Admin扩展功能。
基础Admin配置
from django.contrib import admin
from adminsortable2.admin import SortableAdminMixin
from shop.admin.product import CMSPageAsCategoryMixin, ProductImageInline, InvalidateProductCacheMixin
@admin.register(SmartCard)
class SmartCardAdmin(InvalidateProductCacheMixin, SortableAdminMixin, CMSPageAsCategoryMixin, admin.ModelAdmin):
fields = ['product_name', 'slug', 'product_code', 'unit_price', 'active', 'caption', 'description', 'storage', 'card_type']
inlines = [ProductImageInline]
prepopulated_fields = {'slug': ['product_name']}
list_display = ['product_name', 'product_code', 'unit_price', 'active']
国际化Admin配置
from parler.admin import TranslatableAdmin
class SmartCardAdmin(InvalidateProductCacheMixin, SortableAdminMixin, TranslatableAdmin, CMSPageAsCategoryMixin, admin.ModelAdmin):
# 配置同上,增加翻译支持
pass
Admin功能亮点
-
缓存管理:
InvalidateProductCacheMixin
自动清除产品缓存
-
排序功能:
SortableAdminMixin
提供拖拽排序
-
分类管理:
CMSPageAsCategoryMixin
关联CMS页面作为分类
-
图片管理:
ProductImageInline
内联管理产品图片
最佳实践建议
-
字段设计:
- 为每个产品属性创建独立字段
- 避免使用通用字段存储不同类型数据
-
性能考虑:
- 合理使用索引
- 注意查询优化
-
扩展性:
- 预留扩展字段
- 考虑未来可能的产品变体需求
-
多语言策略:
- 提前规划需要翻译的字段
- 保持翻译一致性
总结
通过本文,我们详细探讨了在 Django-Shop 中实现智能卡产品模型的完整过程。从基础模型设计到国际化支持,再到后台管理配置,每个环节都体现了 Django-Shop 框架的灵活性和强大功能。这种设计模式不仅适用于智能卡产品,也可以轻松扩展到其他类型的产品模型实现。
在后续教程中,我们将继续探讨购物车和结账流程的实现,进一步完善电商系统的核心功能。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考