diff --git a/backend/data/省市区.xlsx b/backend/data/省市区.xlsx new file mode 100644 index 0000000..a7797e7 Binary files /dev/null and b/backend/data/省市区.xlsx differ diff --git a/backend/system/management/commands/import_city_area_data.py b/backend/system/management/commands/import_city_area_data.py new file mode 100644 index 0000000..01f5c6b --- /dev/null +++ b/backend/system/management/commands/import_city_area_data.py @@ -0,0 +1,35 @@ +import pandas as pd +from django.core.management.base import BaseCommand +from system.models import CityArea + + +class Command(BaseCommand): + help = '导入省市区数据' + + def handle(self, *args, **options): + file_path = 'data/省市区.xlsx' # 文件路径,根据实际情况调整 + try: + # 读取 Excel 文件 + excel_file = pd.ExcelFile(file_path) + df = excel_file.parse() # 假设只有一个工作表,如果有多个,需要调整 + + # 使用 bulk_create 进行批量导入 + bulk_objects = [] + for index, row in df.iterrows(): + bulk_objects.append(CityArea( + prov_id=row['省份ID'], + prov_name=row['省份名称'], + city_id=row['城市ID'], + city_name=row['城市名称'], + area_id=row['地区ID'], + area_name=row['地区名称'] + )) + + # 批量创建对象 + CityArea.objects.bulk_create(bulk_objects, batch_size=1000) + + self.stdout.write(self.style.SUCCESS('数据导入成功')) + except FileNotFoundError: + self.stdout.write(self.style.ERROR(f'文件 {file_path} 未找到')) + except KeyError as e: + self.stdout.write(self.style.ERROR(f'列 {e} 未找到')) \ No newline at end of file diff --git a/backend/system/migrations/0005_cityarea.py b/backend/system/migrations/0005_cityarea.py new file mode 100644 index 0000000..618d3fc --- /dev/null +++ b/backend/system/migrations/0005_cityarea.py @@ -0,0 +1,99 @@ +# Generated by Django 5.2.1 on 2025-10-13 12:34 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("system", "0004_config"), + ] + + operations = [ + migrations.CreateModel( + name="CityArea", + fields=[ + ( + "id", + models.BigAutoField( + auto_created=True, + primary_key=True, + serialize=False, + verbose_name="ID", + ), + ), + ( + "remark", + models.CharField( + blank=True, + db_comment="备注", + help_text="备注", + max_length=256, + null=True, + verbose_name="备注", + ), + ), + ( + "creator", + models.CharField( + blank=True, + db_comment="创建人", + help_text="创建人", + max_length=64, + null=True, + verbose_name="创建人", + ), + ), + ( + "modifier", + models.CharField( + blank=True, + db_comment="修改人", + help_text="修改人", + max_length=64, + null=True, + verbose_name="修改人", + ), + ), + ( + "update_time", + models.DateTimeField( + auto_now=True, + db_comment="修改时间", + help_text="修改时间", + null=True, + verbose_name="修改时间", + ), + ), + ( + "create_time", + models.DateTimeField( + auto_now_add=True, + db_comment="创建时间", + help_text="创建时间", + null=True, + verbose_name="创建时间", + ), + ), + ( + "is_deleted", + models.BooleanField( + db_comment="是否软删除", + default=False, + verbose_name="是否软删除", + ), + ), + ("prov_id", models.IntegerField(verbose_name="省id")), + ("prov_name", models.CharField(max_length=255, verbose_name="省")), + ("city_id", models.IntegerField(verbose_name="市id")), + ("city_name", models.CharField(max_length=255, verbose_name="市")), + ("area_id", models.IntegerField(verbose_name="区id")), + ("area_name", models.CharField(max_length=255, verbose_name="区")), + ], + options={ + "verbose_name": "省市区", + "verbose_name_plural": "省市区", + "db_table": "system_city_area", + }, + ), + ] diff --git a/backend/system/models.py b/backend/system/models.py index 8552811..c1953bf 100644 --- a/backend/system/models.py +++ b/backend/system/models.py @@ -329,3 +329,18 @@ class Config(CoreModel): def __str__(self): return f"{self.name}({self.key})" + +class CityArea(CoreModel): + """省市区模型""" + prov_id = models.IntegerField(verbose_name="省id") + prov_name = models.CharField(max_length=255, verbose_name="省") + city_id = models.IntegerField(verbose_name="市id") + city_name = models.CharField(max_length=255, verbose_name="市") + area_id = models.IntegerField(verbose_name="区id") + area_name = models.CharField(max_length=255, verbose_name="区") + + class Meta: + db_table = "system_city_area" + verbose_name = "省市区" + verbose_name_plural = verbose_name +