import os import sys import django from loguru import logger from pypinyin import lazy_pinyin, Style # 配置 Django 环境 sys.path.append(os.path.dirname(os.path.abspath(__file__))) os.environ.setdefault("DJANGO_SETTINGS_MODULE", "server.settings") # 修改为你的 settings 路径 django.setup() from faker import Faker from base.models import MainMenu # 初始化 Faker,设置中文(如果需要中文名) # 初始化 Faker (zh_CN 生成中文数据) fake = Faker('zh_CN') # --- 核心数据结构:定义你的菜单层级 --- MENU_STRUCTURE = { "信息公开": [ "通知通告", "法律法规", "政策文件", "政策解读" ], "党建引领": [ "党建工作", "党建轮播", "党风廉政", "先进典型" ], "互动交流": [ "专家访谈", "调查征集", "在线咨询" ], "消防科普": [ "数字消防", "火灾预防", "自救逃生" ], "办事服务": [ "办事指南", "政务服务", "资料下载", "办事统计" ] } def get_slug(text): """ 将中文转换为拼音 Slug 例如: "信息公开" -> "xin-xi-gong-kai" """ # lazy_pinyin 返回拼音列表,join 将其用 '-' 连接 return "-".join(lazy_pinyin(text, style=Style.NORMAL)) def seed_main_menu(): logger.info("🚀 开始生成站点导航数据...") # 1. 清空旧数据 (可选,如果需要重置数据请取消注释) MainMenu.objects.all().delete() logger.info("🧹 已清空旧数据") created_count = 0 # 2. 循环创建主菜单和子板块 for main_title, sub_titles in MENU_STRUCTURE.items(): # --- 创建主菜单 --- # 生成唯一的 code,例如 "xin-xi-gong-kai" main_code = get_slug(text=main_title) logger.info(f"主菜单: [{main_title}] Code: [{main_code}]") main_menu, created = MainMenu.objects.get_or_create( title=main_title, defaults={ 'code': main_code, 'url': main_code, # 模拟 URL 'is_external': False, 'order': created_count, 'visible': True } ) if created: logger.info(f"✅ 创建主菜单: [{main_title}]") else: logger.info(f"⏭️ 主菜单已存在: [{main_title}]") # --- 创建子板块 --- for idx, sub_title in enumerate(sub_titles): sub_code = get_slug(text=sub_title) logger.info(f"子菜单: [{sub_title}] Code: [{sub_code}]") sub_menu, sub_created = MainMenu.objects.get_or_create( title=sub_title, parent=main_menu, # 关键:关联父级 defaults={ 'code': sub_code, 'url': sub_code, 'is_external': False, 'order': idx, # 子菜单排序 'visible': True } ) if sub_created: logger.info(f" └─ ✅ 创建子板块: [{sub_title}]") else: logger.info(f" └─ ⏭️ 子板块已存在: [{sub_title}]") created_count += 1 logger.info(f"\n🎉 导航数据生成完毕!共处理 {len(MENU_STRUCTURE)} 个主菜单。") if __name__ == "__main__": seed_main_menu()