全国省市県三級表作成データ+コード


目的
プロジェクト開発では、省・市・県の3級区域表を常に必要とし、後続として使用し、共有にも使用し、重複労働を減らす.
この文書のデータは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