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

Django如何将同名最低层级分类的产品同步到其他同名分类下

实现方案

核心逻辑

  • 第一步:筛选所有最低级分类(无任何子分类的分类)
  • 第二步:将最低级分类按headline字段分组,仅处理分组内数量≥2的同名分类
  • 第三步:收集分组内所有分类关联的产品,去重后同步追加到分组内所有分类下

代码实现

一次性执行脚本(可直接在Django Shell中运行)

from itertools import groupby
from myapp.models import Category, Product # 替换myapp为你自己的应用名

# 1. 筛选所有最低级分类(无子分类),并按名称排序方便分组
leaf_categories = Category.objects.filter(children__isnull=True).order_by('headline')

# 2. 按分类名称分组
for name, category_group in groupby(leaf_categories, key=lambda x: x.headline):
    category_list = list(category_group)
    # 跳过没有同名分类的分组
    if len(category_list) < 2:
        continue
    # 3. 收集该组所有分类下的去重产品
    all_products = Product.objects.filter(category__in=category_list).distinct()
    # 4. 同步产品到组内所有分类下,add方法会自动跳过已存在的关联关系
    for cat in category_list:
        cat.products.add(*all_products)

自动同步方案(可选:分类变动时自动触发)

如果需要在新增、修改分类时自动完成同名最低级分类的产品同步,可以添加Django信号实现:

# 在你应用的signals.py中添加如下代码
from django.db.models.signals import post_save
from django.dispatch import receiver
from myapp.models import Category, Product # 替换myapp为你自己的应用名

@receiver(post_save, sender=Category)
def sync_leaf_category_products(sender, instance, **kwargs):
    # 仅处理最低级分类
    if instance.children.exists():
        return
    # 查找所有同名的最低级分类
    same_name_leaf_cats = Category.objects.filter(headline=instance.headline, children__isnull=True)
    if same_name_leaf_cats.count() < 2:
        return
    # 收集该组所有分类下的去重产品
    all_products = Product.objects.filter(category__in=same_name_leaf_cats).distinct()
    # 同步到所有同名分类下
    for cat in same_name_leaf_cats:
        cat.products.add(*all_products)

记得在应用的apps.py中注册信号,保证信号生效。

效果验证

脚本执行完成后,可以通过如下代码验证同步结果:

# 替换id为你两个Phone分类的实际id
mobile_phone_cat = Category.objects.get(id=xxx)
smart_phone_cat = Category.objects.get(id=yyy)
print(mobile_phone_cat.products.count()) # 输出4
print(smart_phone_cat.products.count()) # 输出4

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 05:06:03