5.5 KiB
5.5 KiB
修复地区数据计划
目标
补全缺失的市级和区县级地区数据,使数据库与全国实际行政区划一致。
当前状态分析
问题
-
市级缺失 22 个:
- 内蒙古缺 3 个盟(兴安盟、锡林郭勒盟、阿拉善盟)
- 青海缺 6 个自治州(海北、黄南、海南、果洛、玉树、海西)
- 四川缺 3 个自治州(阿坝、甘孜、凉山)
- 贵州缺 3 个自治州(黔西南、黔东南、黔南)
- 吉林缺 1 个(延边朝鲜族自治州)
- 黑龙江缺 1 个(大兴安岭地区)
- 湖北缺 1 个(恩施土家族苗族自治州)
- 湖南缺 1 个(湘西土家族苗族自治州)
- 海南缺 1 个(儋州市)
-
区县级完全缺失(约 2843 个)
实现方案
1. 补全市级数据(22个)
文件: c:\Users\12914\Desktop\vscode\chunyu_project\user\management\commands\seed_regions.py
在 CITIES 列表末尾添加缺失的市级地区:
# 在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 文件加载区县级数据:
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条) |
验证步骤
- 运行
python manage.py seed_regions - 验证市级数量:
Region.objects.filter(level=2).count()== 340 - 验证区县级数量:
Region.objects.filter(level=3).count()>= 2800 - 验证API:
GET /user/regions/?parent_code=130100返回石家庄市下属区县 - 前端测试:个人中心地区选择器可正常显示三级级联
假设与决策
假设
- JSON 文件可手动创建或通过外部脚本生成
- 国家统计局数据为权威来源
- 数据量约 300KB,加载时间可接受
决策
- 使用
get_or_create避免重复导入 - 区县级数据独立为 JSON 文件,便于维护和更新
- 省级、市级数据继续硬编码(数量少且稳定)