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

Django:如何用查询集/自定义过滤器创建电商子分类

嘿,这个需求完全可行!结合你已经在用的MPTT分类模型,加上自定义的关键词匹配过滤器,完全能实现从产品描述里自动生成细分子分类的功能,我给你拆解一下具体怎么做:

1. 先确认MPTT分类模型的基础结构

首先得确保你的MPTT分类模型是标准的层级结构,比如你可能已经有类似这样的代码了:

from mptt.models import MPTTModel, TreeForeignKey

class Category(MPTTModel):
    name = models.CharField(max_length=255)
    parent = TreeForeignKey('self', on_delete=models.CASCADE, null=True, blank=True, related_name='children')

    class MPTTMeta:
        order_insertion_by = ['name']

如果你的模型已经是这样的,那我们可以直接往下走。

2. 核心:自定义分类匹配过滤器的设计

要从产品描述(比如"stone wash bootcut jeans")里提取子分类,核心是做两件事:定义关键词到分类的映射规则,然后写一个解析函数来扫描描述、匹配规则,自动创建/关联MPTT层级的分类。

具体实现步骤

第一步:先定义分类匹配规则

我们可以用一个字典来存储「关键词-分类路径」的映射,比如你要实现「男装>牛仔裤」,就可以这么写:

# 规则格式:{匹配关键词: (父分类名称, 子分类名称)}
# 注意:把长关键词放在前面,避免被短关键词拆分匹配
CATEGORY_RULES = {
    'stone wash': ('牛仔裤', '石洗牛仔裤'),
    'bootcut': ('牛仔裤', '靴型牛仔裤'),
    'jeans': ('男装', '牛仔裤'),
    # 后续可以根据产品品类扩展更多规则,比如'hoodie': ('男装', '连帽卫衣')
}

第二步:写自定义解析函数

这个函数会帮你扫描产品描述,匹配规则,然后自动创建对应的MPTT分类:

from .models import Category

def parse_description_to_category(description):
    # 先把描述转成小写,避免大小写匹配问题
    desc_lower = description.lower()
    matched_categories = []
    
    # 按关键词长度倒序排序,优先匹配长关键词(比如先匹配"stone wash"再匹配"wash")
    sorted_rules = sorted(CATEGORY_RULES.items(), key=lambda x: len(x[0]), reverse=True)
    
    for keyword, (parent_name, child_name) in sorted_rules:
        if keyword in desc_lower:
            # 先获取/创建父分类(顶级分类的parent设为None)
            parent_category, _ = Category.objects.get_or_create(
                name=parent_name,
                parent=None if parent_name == '男装' else Category.objects.get(name=parent_name)
            )
            # 再获取/创建子分类,关联到父分类下
            child_category, _ = Category.objects.get_or_create(
                name=child_name,
                parent=parent_category
            )
            matched_categories.append(child_category)
            # 如果只需要匹配最相关的一个分类,可以在这里加break;如果要匹配多个就去掉
            # break
    
    return matched_categories

第三步:集成到你的CSV导入流程

在你现有的CSV导入代码里,处理每一行产品数据时调用这个函数就行:

import csv

def import_products_from_csv(csv_file_path):
    with open(csv_file_path, 'r', encoding='utf-8') as f:
        reader = csv.DictReader(f)
        for row in reader:
            product_desc = row.get('description', '')
            # 获取匹配到的分类
            matched_cats = parse_description_to_category(product_desc)
            # 这里把分类关联到你的产品模型(假设Product有categories多对多字段)
            # product = Product.objects.create(
            #     name=row['name'],
            #     description=product_desc,
            #     # 其他字段...
            # )
            # product.categories.add(*matched_cats)
3. 进阶优化建议
  • 正则匹配支持:如果关键词有变体(比如jean和jeans),可以把规则改成正则表达式,提升匹配灵活性:
    import re
    CATEGORY_RULES = {
        r'\bjeans?\b': ('男装', '牛仔裤'),  # 匹配jean或jeans
        r'\bstone wash\b': ('牛仔裤', '石洗牛仔裤'),
    }
    # 解析函数里用re.search替代in判断:if re.search(keyword, desc_lower)
    
  • 添加审核机制:如果自动匹配的分类存疑(比如一个描述匹配到多个冲突分类),可以把这些条目放到审核队列,由人工确认后再创建,避免生成无效分类。
  • 缓存优化:如果CSV数据量很大,建议把已存在的分类缓存到内存里(比如用一个字典存「分类名称-分类对象」),减少数据库查询次数,提升导入速度。
4. 注意事项
  • 确保MPTT模型的parent字段配置正确,不然子分类的层级会混乱。
  • 分类名称要统一,比如不要同时出现「牛仔裤」和「牛仔长裤」,可以在规则里统一命名,或者在创建分类时做去重校验。
  • 如果你的CSV里有重复的产品描述,记得处理重复分类的创建逻辑,避免生成重复的分类条目。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 04:36:26