全国省市县三级表创建 数据+代码

目的

项目开发中,经常需要省市县三级区域表,留作后续可用,也用作分享,减少重复劳动。

该文中数据为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

你可能感兴趣的:(数据库,其他,django,python)