目的
项目开发中,经常需要省市县三级区域表,留作后续可用,也用作分享,减少重复劳动。
该文中数据为2020年6月份数据,数据下载源参考:
【2020年6月】民政部省市区三级联动行政区划数据库
本文所用文本(处理后,可直接使用,和本文一体)下载链接:
2020年6月全国省市县.txt
模型
# models.py表的模型
from django.db import models
class ProvinceThreeLevel(models.Model):
"""
行政区划
"""
area_code = models.CharField(unique=True,max_length=8, verbose_name='编号')
full_name = models.CharField(max_length=16, verbose_name='全称')
short_name = models.CharField(max_length=16, verbose_name='简称')
post_code = models.CharField(max_length=8,null=True, verbose_name='邮编')
area_id = models.CharField(max_length=8,null=True, verbose_name='电话区号')
pinyin = models.CharField(max_length=64, verbose_name='全拼')
short_pinyin = models.CharField(max_length=16, null=True,verbose_name='简拼')
first_char = models.CharField(max_length=4, null=True,verbose_name='首字母')
english = models.CharField(max_length=32, null=True,verbose_name='英文')
longitude = models.CharField(max_length=32,null=True, verbose_name='经度')
latitude = models.CharField(max_length=32,null=True, verbose_name='纬度')
parent = models.ForeignKey('self',
on_delete=models.CASCADE,
related_name='sub_areas',
null=True,
verbose_name='上级行政区划')
class Meta:
db_table = 'province_three_level'
verbose_name = '行政区划'
verbose_name_plural = '行政区划'
添加数据代码
# add_province.py 添加三级表代码文件
import os
import sys
import django
sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "forest_monitor.settings")
django.setup()
from user_profile.models import ProvinceThreeLevel
def save_one(area):
area_code, parent, full_name, area_id, post_code, short_name, pinyin, short_pinyin, first_char, english, longitude, latitude = tuple(
area.strip().split(','))
save_data = {}
for key, value in locals().items():
if key in ['save_data','area']:
continue
if value:
save_data[key] = value
if parent == '0':
del save_data['parent']
else:
parent_obj=ProvinceThreeLevel.objects.get(area_code=parent)
save_data['parent']=parent_obj
if not ProvinceThreeLevel.objects.filter(area_code=area_code).exists():
ProvinceThreeLevel.objects.create(**save_data)
def main():
with open('./省市县.txt', 'r', encoding='utf-8') as fr:
areas = fr.readlines()
for area in areas:
save_one(area)
if __name__ == "__main__":
main()
序列化
# serializer.py
class ProvinceThreeSerializer(serializers.ModelSerializer):
children=serializers.SerializerMethodField() # 子区域
value=serializers.SerializerMethodField() # 全称
lable=serializers.SerializerMethodField() # 行政区域编码
class Meta:
model = ProvinceThreeLevel
fields=('value','lable','children')
def get_children(self,obj):
res=ProvinceThreeSerializer(obj.sub_areas,many=True).data
return res
def get_value(self,obj):
return obj.area_code
def get_lable(self,obj):
return obj.full_name