162 lines
5.5 KiB
Markdown
162 lines
5.5 KiB
Markdown
# 修复地区数据计划
|
||
|
||
## 目标
|
||
补全缺失的市级和区县级地区数据,使数据库与全国实际行政区划一致。
|
||
|
||
## 当前状态分析
|
||
|
||
### 问题
|
||
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 文件,便于维护和更新
|
||
- 省级、市级数据继续硬编码(数量少且稳定)
|