# 修复地区数据计划 ## 目标 补全缺失的市级和区县级地区数据,使数据库与全国实际行政区划一致。 ## 当前状态分析 ### 问题 1. **市级缺失 22 个**: - 内蒙古缺 3 个盟(兴安盟、锡林郭勒盟、阿拉善盟) - 青海缺 6 个自治州(海北、黄南、海南、果洛、玉树、海西) - 四川缺 3 个自治州(阿坝、甘孜、凉山) - 贵州缺 3 个自治州(黔西南、黔东南、黔南) - 吉林缺 1 个(延边朝鲜族自治州) - 黑龙江缺 1 个(大兴安岭地区) - 湖北缺 1 个(恩施土家族苗族自治州) - 湖南缺 1 个(湘西土家族苗族自治州) - 海南缺 1 个(儋州市) 2. **区县级完全缺失**(约 2843 个) ## 实现方案 ### 1. 补全市级数据(22个) **文件**: `c:\Users\12914\Desktop\vscode\chunyu_project\user\management\commands\seed_regions.py` 在 `CITIES` 列表末尾添加缺失的市级地区: ```python # 在CITIES列表末尾追加 # 内蒙古(补3个盟) ("兴安盟", "152200", "xingan", "150000"), ("锡林郭勒盟", "152500", "xilinguole", "150000"), ("阿拉善盟", "152900", "alashan", "150000"), # 青海(补6个自治州) ("海北藏族自治州", "632200", "haibei", "630000"), ("黄南藏族自治州", "632300", "huangnan", "630000"), ("海南藏族自治州", "632500", "hainan", "630000"), ("果洛藏族自治州", "632600", "guoluo", "630000"), ("玉树藏族自治州", "632700", "yushu", "630000"), ("海西蒙古族藏族自治州", "632800", "haixi", "630000"), # 四川(补3个自治州) ("阿坝藏族羌族自治州", "513200", "aba", "510000"), ("甘孜藏族自治州", "513300", "ganzi", "510000"), ("凉山彝族自治州", "513400", "liangshan", "510000"), # 贵州(补3个自治州) ("黔西南布依族苗族自治州", "522300", "qianxinan", "520000"), ("黔东南苗族侗族自治州", "522600", "qiandongnan", "520000"), ("黔南布依族苗族自治州", "522700", "qiannan", "520000"), # 吉林(补1个) ("延边朝鲜族自治州", "222400", "yanbian", "220000"), # 黑龙江(补1个) ("大兴安岭地区", "232700", "daxinganling", "230000"), # 湖北(补1个) ("恩施土家族苗族自治州", "422800", "enshi", "420000"), # 湖南(补1个) ("湘西土家族苗族自治州", "433100", "xiangxi", "430000"), # 海南(补1个) # 注:儋州市已存在,需要检查编码是否正确 ``` ### 2. 区县级数据(约2843个) **文件**: `c:\Users\12914\Desktop\vscode\chunyu_project\user\management\commands\data\districts.json` 方案: - 创建独立的 JSON 文件存储区县级数据 - 数据格式:`[{"name": "东城区", "code": "110101", "parent_code": "110100", "pinyin": "dongcheng"}]` - 文件预计约 300KB **文件**: `c:\Users\12914\Desktop\vscode\chunyu_project\user\management\commands\seed_regions.py` 修改导入逻辑,使其支持从 JSON 文件加载区县级数据: ```python import json import os class Command(BaseCommand): help = '导入全国省市区地区数据' def handle(self, *args, **options): # ... 导入省级、市级 ... # 导入区县级 self.import_districts() def import_districts(self): """从JSON文件导入区县级数据""" json_path = os.path.join(os.path.dirname(__file__), 'data', 'districts.json') if not os.path.exists(json_path): self.stdout.write(self.style.WARNING(f'区县级数据文件不存在: {json_path}')) return with open(json_path, 'r', encoding='utf-8') as f: districts = json.load(f) count = 0 for item in districts: parent = Region.objects.filter(code=item['parent_code'], level=2).first() if not parent: continue _, created = Region.objects.get_or_create( code=item['code'], defaults={ 'name': item['name'], 'level': 3, 'pinyin': item.get('pinyin', ''), 'parent': parent, 'sort_order': 0, } ) if created: count += 1 self.stdout.write(self.style.SUCCESS(f'成功导入 {count} 条区县级数据')) ``` ### 3. 数据来源 区县级数据来源: - 国家统计局行政区划代码(2024年版) - 民政部全国行政区划信息查询平台 - JSON 文件需手动生成或通过脚本获取 ## 文件清单 | 文件 | 操作 | 说明 | |------|------|------| | `user/management/commands/seed_regions.py` | 修改 | 补全22个市级地区 + 添加区县级导入逻辑 | | `user/management/commands/data/districts.json` | 新建 | 区县级数据文件(约2843条) | ## 验证步骤 1. 运行 `python manage.py seed_regions` 2. 验证市级数量:`Region.objects.filter(level=2).count()` == 340 3. 验证区县级数量:`Region.objects.filter(level=3).count()` >= 2800 4. 验证API:`GET /user/regions/?parent_code=130100` 返回石家庄市下属区县 5. 前端测试:个人中心地区选择器可正常显示三级级联 ## 假设与决策 ### 假设 - JSON 文件可手动创建或通过外部脚本生成 - 国家统计局数据为权威来源 - 数据量约 300KB,加载时间可接受 ### 决策 - 使用 `get_or_create` 避免重复导入 - 区县级数据独立为 JSON 文件,便于维护和更新 - 省级、市级数据继续硬编码(数量少且稳定)