Django-Shop 教程:智能卡产品模型详解

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()

关键设计要点

  1. 继承结构

    • BaseProduct:所有产品模型的基类
    • CMSPageReferenceMixin:提供CMS页面关联功能
  2. 核心字段

    • 产品特有属性:卡类型、存储容量等
    • 电商通用字段:价格、产品编码等
    • CMS相关字段:slug、排序等
  3. 价格处理

    • 使用get_price()方法而非固定字段,便于实现动态定价
    • MoneyField专门处理货币金额
  4. 搜索优化

    • 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')]

国际化设计要点

  1. 翻译字段选择

    • 通常翻译产品描述等文本内容
    • 产品编码等唯一标识不需翻译
  2. 性能优化

    • 使用prefetch_related预加载翻译
    • 确保查询效率
  3. 灵活性

    • 可根据需要选择翻译字段
    • 保留非翻译字段的原始值

后台管理配置

完善的后台管理是电商系统的重要组成部分。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功能亮点

  1. 缓存管理

    • InvalidateProductCacheMixin自动清除产品缓存
  2. 排序功能

    • SortableAdminMixin提供拖拽排序
  3. 分类管理

    • CMSPageAsCategoryMixin关联CMS页面作为分类
  4. 图片管理

    • ProductImageInline内联管理产品图片

最佳实践建议

  1. 字段设计

    • 为每个产品属性创建独立字段
    • 避免使用通用字段存储不同类型数据
  2. 性能考虑

    • 合理使用索引
    • 注意查询优化
  3. 扩展性

    • 预留扩展字段
    • 考虑未来可能的产品变体需求
  4. 多语言策略

    • 提前规划需要翻译的字段
    • 保持翻译一致性

总结

通过本文,我们详细探讨了在 Django-Shop 中实现智能卡产品模型的完整过程。从基础模型设计到国际化支持,再到后台管理配置,每个环节都体现了 Django-Shop 框架的灵活性和强大功能。这种设计模式不仅适用于智能卡产品,也可以轻松扩展到其他类型的产品模型实现。

在后续教程中,我们将继续探讨购物车和结账流程的实现,进一步完善电商系统的核心功能。

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史艾岭

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值