You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Django电商平台:如何为不同服饰品类创建关联尺码表?

Django电商平台尺码模型实现方案

核心设计思路

要实现「品类绑定专属尺码、选品类后过滤可选尺码」的需求,核心是通过多对多关系关联品类与尺码,再让商品绑定具体尺码。以下是分步实现方案:

1. 独立尺码模型(Size)

先定义存储所有尺码值的模型,支持自定义排序,保证尺码按合理顺序展示:

from django.db import models
from django.utils.translation import gettext_lazy as _

class Size(models.Model):
    name = models.CharField(max_length=20, verbose_name=_("尺码名称"), unique=True)
    # 可选:添加排序字段,让XS/S/M或US尺码按逻辑顺序排列
    order = models.PositiveIntegerField(default=0, verbose_name=_("排序权重"))

    class Meta:
        ordering = ['order']
        verbose_name = _("尺码")
        verbose_name_plural = _("尺码")

    def __str__(self):
        return self.name

2. 给品类模型(Category)添加尺码关联

给你的Category模型新增多对多字段,绑定该品类支持的所有尺码(一个尺码可属于多个品类,比如XS适配衬衫、T恤):

class Category(models.Model):
    name = models.CharField(max_length=100, verbose_name=_("品类名称"))
    # 其他原有字段...
    sizes = models.ManyToManyField(Size, related_name="categories", verbose_name=_("关联尺码"))

    def __str__(self):
        return self.name

3. 修改商品模型(Product)关联尺码

在现有Product模型中添加尺码外键,同时可在后台管理中实现动态过滤(前端需自己做联动逻辑):

class Product(models.Model):
    # 你的原有字段...
    title = models.CharField(max_length=100)
    price = models.DecimalField(max_digits=6, decimal_places=2)
    category = models.ForeignKey(Category, related_name='style_products', on_delete=models.CASCADE, null=True, blank=True)
    
    # 新增:关联具体尺码
    size = models.ForeignKey(Size, on_delete=models.SET_NULL, null=True, blank=True, verbose_name=_("尺码"))

    # 可选:Django Admin中动态过滤尺码选项
    # 需在Admin类中重写formfield_for_foreignkey
    # @admin.register(Product)
    # class ProductAdmin(admin.ModelAdmin):
    #     def formfield_for_foreignkey(self, db_field, request, **kwargs):
    #         if db_field.name == "size":
    #             obj_id = request.resolver_match.kwargs.get('object_id')
    #             if obj_id:
    #                 product = Product.objects.get(id=obj_id)
    #                 if product.category:
    #                     kwargs["queryset"] = product.category.sizes.all()
    #         return super().formfield_for_foreignkey(db_field, request, **kwargs)

    # 原有方法...
    def __str__(self):
        return self.title

前端联动实现提示

发布商品时,需通过前端逻辑实现「选品类后更新尺码选项」:

  • 监听品类选择框的change事件
  • 发送AJAX请求获取当前品类对应的尺码列表
  • 动态更新尺码下拉框的选项

伪代码示例(jQuery):

$('#id_category').change(function() {
    const categoryId = $(this).val();
    const sizeSelect = $('#id_size');
    
    if (categoryId) {
        $.get(`/api/categories/${categoryId}/sizes/`, function(data) {
            sizeSelect.empty().append('<option value="">请选择尺码</option>');
            data.forEach(size => {
                sizeSelect.append(`<option value="${size.id}">${size.name}</option>`);
            });
        });
    } else {
        sizeSelect.empty().append('<option value="">请先选择品类</option>');
    }
});

可选优化:拆分商品款与库存

如果需要支持「一个商品款对应多尺码库存」的场景,建议拆分模型:

  • Product:存储商品款基础信息(标题、描述、品牌等),不含数量、尺码
  • Stock:关联商品款与尺码,存储对应尺码的库存数量、价格(不同尺码可设不同价格)

示例Stock模型:

class Stock(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="stocks", verbose_name=_("商品款"))
    size = models.ForeignKey(Size, on_delete=models.CASCADE, verbose_name=_("尺码"))
    quantity = models.IntegerField(verbose_name=_("库存数量"))
    price = models.DecimalField(max_digits=6, decimal_places=2, verbose_name=_("价格"))

    class Meta:
        unique_together = ('product', 'size')  # 避免同一商品款的同一尺码重复存储

    def __str__(self):
        return f"{self.product.title} - {self.size.name}"

内容的提问来源于stack exchange,提问作者vllscarf

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 07:36:00