init_area.py 2.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # 城市联动
  2. """
  3. 到乡级 使用方法
  4. 1. https://www.npmjs.com/package/china-division 下载数据,把对应的json放入对应目录
  5. 2. 修改此文件中对应json名
  6. 3. 右击执行此py文件进行初始化
  7. """
  8. import json
  9. import os
  10. import django
  11. import pypinyin
  12. from django.core.management import BaseCommand
  13. from django.db import connection
  14. from application import dispatch
  15. os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'application.settings')
  16. django.setup()
  17. from application.settings import BASE_DIR
  18. from dvadmin.system.models import Area
  19. area_code_list = []
  20. def area_list(code_list, pcode=None, depth=1):
  21. """
  22. 递归获取所有列表
  23. """
  24. for code_dict in code_list:
  25. code = code_dict.get('code', None)
  26. name = code_dict.get('name', None)
  27. children = code_dict.get('children', None)
  28. pinyin = ''.join([''.join(i) for i in pypinyin.pinyin(name, style=pypinyin.NORMAL)])
  29. area_code_list.append(
  30. {
  31. "name": name,
  32. "code": code,
  33. "level": depth,
  34. "pinyin": pinyin,
  35. "initials": pinyin[0].upper() if pinyin else "#",
  36. "pcode_id": pcode,
  37. }
  38. )
  39. if children:
  40. area_list(code_list=children, pcode=code, depth=depth + 1)
  41. def main():
  42. with open(os.path.join(BASE_DIR, 'dvadmin', 'system', 'util', 'pca-code.json'), 'r', encoding="utf-8") as load_f:
  43. code_list = json.load(load_f)
  44. area_list(code_list)
  45. if Area.objects.count() == 0:
  46. Area.objects.bulk_create([Area(**ele) for ele in area_code_list])
  47. else:
  48. for ele in area_code_list:
  49. code = ele.pop("code")
  50. Area.objects.update_or_create(code=code, defaults=ele)
  51. class Command(BaseCommand):
  52. """
  53. 项目初始化命令: python manage.py init
  54. """
  55. def add_arguments(self, parser):
  56. pass
  57. def handle(self, *args, **options):
  58. print(f"正在准备初始化省份数据...")
  59. if dispatch.is_tenants_mode():
  60. from django_tenants.utils import get_tenant_model
  61. from django_tenants.utils import tenant_context
  62. for tenant in get_tenant_model().objects.exclude(schema_name='public'):
  63. with tenant_context(tenant):
  64. print(f"租户[{connection.tenant.schema_name}]初始化数据开始...")
  65. main()
  66. print(f"租户[{connection.tenant.schema_name}]初始化数据完成!")
  67. else:
  68. main()
  69. print("省份数据初始化数据完成!")