feat(migrations): add Phase 4.0+4.1 verbose_name/help_text migrations

Generated by manage.py makemigrations after Phase 4.0 (model Meta verbose_name)
and Phase 4.1 (field-level verbose_name/help_text) were committed across all 9 apps.

Field-meta only (Alter field on Meta options); no schema changes.
This commit is contained in:
2026-04-30 09:47:44 +08:00
parent 8faa68b615
commit d00ff12ba0
9 changed files with 3880 additions and 0 deletions

View File

@@ -0,0 +1,528 @@
# Generated by Django 4.2.16 on 2026-04-30 01:46
import django.contrib.postgres.fields
import django.contrib.postgres.search
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('org', '0003_alter_orgunit_address_city_and_more'),
('region', '0003_alter_businessarea_district_and_more'),
('fonrey_complex', '0003_alter_building_options_alter_complex_options_and_more'),
]
operations = [
migrations.AlterField(
model_name='building',
name='built_year',
field=models.SmallIntegerField(blank=True, null=True, verbose_name='竣工年份'),
),
migrations.AlterField(
model_name='building',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='buildings', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='building',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_buildings', to='org.staff', verbose_name='创建人'),
),
migrations.AlterField(
model_name='building',
name='has_elevator',
field=models.BooleanField(blank=True, null=True, verbose_name='是否有电梯'),
),
migrations.AlterField(
model_name='building',
name='is_active',
field=models.BooleanField(default=True, help_text='FALSE=已停用(楼栋被删除或合并)', verbose_name='是否启用'),
),
migrations.AlterField(
model_name='building',
name='is_standard',
field=models.BooleanField(default=False, help_text='TRUE=已经运营核准', verbose_name='是否标准结构'),
),
migrations.AlterField(
model_name='building',
name='land_use_years',
field=models.CharField(blank=True, default='', max_length=30, verbose_name='土地使用年限'),
),
migrations.AlterField(
model_name='building',
name='name',
field=models.CharField(help_text='如「1号楼」「A栋2单元」', max_length=50, verbose_name='楼栋名称'),
),
migrations.AlterField(
model_name='building',
name='property_usage_type',
field=models.CharField(blank=True, choices=[('residential', '住宅'), ('villa', '别墅'), ('commercial_residential', '商住'), ('commercial', '商业'), ('office', '写字楼'), ('other', '其他')], default='', help_text='可与楼盘不同,如商住楼盘内有纯商铺楼栋', max_length=30, verbose_name='物业类型'),
),
migrations.AlterField(
model_name='building',
name='school',
field=models.ForeignKey(blank=True, help_text='楼栋级别的学区差异', null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='buildings', to='region.school', verbose_name='对口学校'),
),
migrations.AlterField(
model_name='building',
name='total_floors',
field=models.SmallIntegerField(blank=True, null=True, verbose_name='总层数'),
),
migrations.AlterField(
model_name='complex',
name='address',
field=models.CharField(blank=True, default='', help_text='不可在编辑页修改,需走纠错流程', max_length=500, verbose_name='详细地址'),
),
migrations.AlterField(
model_name='complex',
name='address_summary',
field=models.CharField(blank=True, default='', help_text='如「海波路1000弄」可编辑', max_length=100, verbose_name='概要地址'),
),
migrations.AlterField(
model_name='complex',
name='building_structure',
field=models.CharField(blank=True, choices=[('unit_room', '单元-房号'), ('other', '其他')], default='', help_text='unit_room=单元-房号 / other=其他', max_length=30, verbose_name='楼栋结构'),
),
migrations.AlterField(
model_name='complex',
name='building_type',
field=models.CharField(blank=True, choices=[('slab', '板楼'), ('tower', '塔楼'), ('slab_tower', '板塔结合')], default='', help_text='slab=板楼 / tower=塔楼 / slab_tower=板塔结合', max_length=20, verbose_name='建筑类型'),
),
migrations.AlterField(
model_name='complex',
name='built_year',
field=models.SmallIntegerField(blank=True, help_text='可多选时存最早竣工年', null=True, verbose_name='竣工年份'),
),
migrations.AlterField(
model_name='complex',
name='built_years',
field=django.contrib.postgres.fields.ArrayField(base_field=models.SmallIntegerField(), blank=True, default=list, help_text='楼盘分期竣工', size=None, verbose_name='竣工年份多值'),
),
migrations.AlterField(
model_name='complex',
name='business_areas',
field=models.ManyToManyField(related_name='complexes', through='fonrey_complex.ComplexBusinessArea', to='region.businessarea', verbose_name='关联商圈'),
),
migrations.AlterField(
model_name='complex',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_complexes', to='org.staff', verbose_name='创建人'),
),
migrations.AlterField(
model_name='complex',
name='developer',
field=models.CharField(blank=True, default='', max_length=200, verbose_name='开发商'),
),
migrations.AlterField(
model_name='complex',
name='district',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='complexes', to='region.district', verbose_name='所属城区'),
),
migrations.AlterField(
model_name='complex',
name='electricity_type',
field=models.CharField(blank=True, choices=[('civil', '民电'), ('commercial', '商电')], default='', help_text='civil=民电 / commercial=商电', max_length=10, verbose_name='电费类型'),
),
migrations.AlterField(
model_name='complex',
name='green_rate',
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:%', max_digits=5, null=True, verbose_name='绿化率'),
),
migrations.AlterField(
model_name='complex',
name='has_central_heating',
field=models.BooleanField(blank=True, null=True, verbose_name='是否统一供暖'),
),
migrations.AlterField(
model_name='complex',
name='has_gas',
field=models.BooleanField(blank=True, null=True, verbose_name='是否有燃气'),
),
migrations.AlterField(
model_name='complex',
name='is_active',
field=models.BooleanField(default=True, help_text='FALSE=已停用楼盘', verbose_name='是否启用'),
),
migrations.AlterField(
model_name='complex',
name='land_use_years',
field=models.CharField(blank=True, default='', help_text='如「70年」', max_length=30, verbose_name='土地使用年限'),
),
migrations.AlterField(
model_name='complex',
name='latitude',
field=models.DecimalField(blank=True, decimal_places=7, help_text='WGS84完整度目标 ≥ 90%', max_digits=10, null=True, verbose_name='纬度'),
),
migrations.AlterField(
model_name='complex',
name='lock_building',
field=models.BooleanField(default=False, help_text='锁定后不可增删楼栋', verbose_name='楼栋锁'),
),
migrations.AlterField(
model_name='complex',
name='lock_info',
field=models.BooleanField(default=False, help_text='锁定后基本信息只读', verbose_name='信息锁'),
),
migrations.AlterField(
model_name='complex',
name='lock_room',
field=models.BooleanField(default=False, verbose_name='房号锁'),
),
migrations.AlterField(
model_name='complex',
name='lock_standard_room',
field=models.BooleanField(default=False, verbose_name='标准房号锁'),
),
migrations.AlterField(
model_name='complex',
name='longitude',
field=models.DecimalField(blank=True, decimal_places=7, help_text='WGS84', max_digits=10, null=True, verbose_name='经度'),
),
migrations.AlterField(
model_name='complex',
name='metro_stations',
field=models.ManyToManyField(related_name='complexes', through='fonrey_complex.ComplexMetroStation', to='region.metrostation', verbose_name='周边地铁站'),
),
migrations.AlterField(
model_name='complex',
name='name',
field=models.CharField(help_text='标准楼盘名称,不可在编辑页直接修改(需走合并/申请流程)', max_length=200, verbose_name='楼盘名称'),
),
migrations.AlterField(
model_name='complex',
name='ownership_category',
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(max_length=30), blank=True, default=list, help_text='多选(运营维护枚举)', size=None, verbose_name='权属类别'),
),
migrations.AlterField(
model_name='complex',
name='parking_ratio',
field=models.CharField(blank=True, default='', help_text='如「100:63」', max_length=20, verbose_name='车位配比'),
),
migrations.AlterField(
model_name='complex',
name='parking_total',
field=models.IntegerField(blank=True, null=True, verbose_name='车位总数'),
),
migrations.AlterField(
model_name='complex',
name='parking_underground',
field=models.IntegerField(blank=True, null=True, verbose_name='地下车位数'),
),
migrations.AlterField(
model_name='complex',
name='plot_area',
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位', max_digits=12, null=True, verbose_name='小区占地面积'),
),
migrations.AlterField(
model_name='complex',
name='plot_ratio',
field=models.DecimalField(blank=True, decimal_places=2, max_digits=5, null=True, verbose_name='容积率'),
),
migrations.AlterField(
model_name='complex',
name='property_company',
field=models.CharField(blank=True, default='', max_length=200, verbose_name='物业公司'),
),
migrations.AlterField(
model_name='complex',
name='property_fee',
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:元/m²/月', max_digits=8, null=True, verbose_name='物业费'),
),
migrations.AlterField(
model_name='complex',
name='property_phone',
field=models.CharField(blank=True, default='', max_length=30, verbose_name='物业电话'),
),
migrations.AlterField(
model_name='complex',
name='property_usage_types',
field=django.contrib.postgres.fields.ArrayField(base_field=models.CharField(choices=[('residential', '住宅'), ('villa', '别墅'), ('commercial_residential', '商住'), ('commercial', '商业'), ('office', '写字楼'), ('other', '其他')], max_length=30), blank=True, default=list, help_text='多选residential / villa / commercial_residential / commercial / office / other', size=None, verbose_name='物业类型'),
),
migrations.AlterField(
model_name='complex',
name='remarks',
field=models.TextField(blank=True, default='', verbose_name='备注'),
),
migrations.AlterField(
model_name='complex',
name='schools',
field=models.ManyToManyField(related_name='complexes', through='fonrey_complex.ComplexSchool', to='region.school', verbose_name='对口学校'),
),
migrations.AlterField(
model_name='complex',
name='search_vector',
field=django.contrib.postgres.search.SearchVectorField(blank=True, help_text='由触发器自动维护name + alias + address', null=True, verbose_name='全文检索向量'),
),
migrations.AlterField(
model_name='complex',
name='total_floor_area',
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位', max_digits=12, null=True, verbose_name='小区总建筑面积'),
),
migrations.AlterField(
model_name='complex',
name='total_households',
field=models.IntegerField(blank=True, null=True, verbose_name='总户数'),
),
migrations.AlterField(
model_name='complex',
name='total_units',
field=models.IntegerField(blank=True, null=True, verbose_name='单元总数'),
),
migrations.AlterField(
model_name='complex',
name='updated_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='updated_complexes', to='org.staff', verbose_name='最后更新人'),
),
migrations.AlterField(
model_name='complex',
name='version',
field=models.IntegerField(default=1, help_text='乐观锁UPDATE 时 +1应用层检测 0 行受影响时抛 ConflictError', verbose_name='版本号'),
),
migrations.AlterField(
model_name='complex',
name='water_type',
field=models.CharField(blank=True, choices=[('civil', '民水'), ('commercial', '商水')], default='', help_text='civil=民水 / commercial=商水', max_length=10, verbose_name='水费类型'),
),
migrations.AlterField(
model_name='complexalias',
name='alias',
field=models.CharField(help_text='最多20字/条,多别名多行存储', max_length=200, verbose_name='别名'),
),
migrations.AlterField(
model_name='complexalias',
name='complex',
field=models.ForeignKey(help_text='别名随楼盘级联删除', on_delete=django.db.models.deletion.CASCADE, related_name='aliases', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexalias',
name='created_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
),
migrations.AlterField(
model_name='complexalias',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_complex_aliases', to='org.staff', verbose_name='创建人'),
),
migrations.AlterField(
model_name='complexalias',
name='is_system',
field=models.BooleanField(default=False, help_text='TRUE=系统/标准别名只读FALSE=用户自定义', verbose_name='是否系统别名'),
),
migrations.AlterField(
model_name='complexattachment',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='attachments', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexattachment',
name='created_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
),
migrations.AlterField(
model_name='complexattachment',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_complex_attachments', to='org.staff', verbose_name='上传人'),
),
migrations.AlterField(
model_name='complexattachment',
name='file_key',
field=models.TextField(help_text='R2/S3 存储路径', verbose_name='文件存储路径'),
),
migrations.AlterField(
model_name='complexattachment',
name='file_name',
field=models.CharField(max_length=255, verbose_name='原始文件名'),
),
migrations.AlterField(
model_name='complexattachment',
name='file_size',
field=models.IntegerField(blank=True, help_text='单位bytes', null=True, verbose_name='文件大小'),
),
migrations.AlterField(
model_name='complexattachment',
name='file_type',
field=models.CharField(blank=True, default='', help_text='MIME type', max_length=50, verbose_name='文件类型'),
),
migrations.AlterField(
model_name='complexattachment',
name='sort_order',
field=models.SmallIntegerField(default=0, verbose_name='排序顺序'),
),
migrations.AlterField(
model_name='complexbusinessarea',
name='business_area',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='complex_links', to='region.businessarea', verbose_name='关联商圈'),
),
migrations.AlterField(
model_name='complexbusinessarea',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='complex_business_areas', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexbusinessarea',
name='is_primary',
field=models.BooleanField(default=False, help_text='主商圈唯一,用于列表显示', verbose_name='是否主商圈'),
),
migrations.AlterField(
model_name='complexmetrostation',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='complex_metro_stations', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexmetrostation',
name='distance_meters',
field=models.IntegerField(blank=True, help_text='单位:米', null=True, verbose_name='步行距离'),
),
migrations.AlterField(
model_name='complexmetrostation',
name='station',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='complex_links', to='region.metrostation', verbose_name='关联地铁站'),
),
migrations.AlterField(
model_name='complexphoto',
name='category',
field=models.CharField(choices=[('complex', '楼盘图'), ('layout', '户型图'), ('vr', 'VR图'), ('other', '其他')], help_text='complex=楼盘图 / layout=户型图 / vr=VR全景 / other=其他', max_length=20, verbose_name='照片类别'),
),
migrations.AlterField(
model_name='complexphoto',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='photos', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexphoto',
name='created_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
),
migrations.AlterField(
model_name='complexphoto',
name='created_by',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='created_complex_photos', to='org.staff', verbose_name='上传人'),
),
migrations.AlterField(
model_name='complexphoto',
name='file_key',
field=models.TextField(help_text='R2/S3 路径', verbose_name='文件存储路径'),
),
migrations.AlterField(
model_name='complexphoto',
name='file_name',
field=models.CharField(blank=True, default='', max_length=255, verbose_name='原始文件名'),
),
migrations.AlterField(
model_name='complexphoto',
name='file_size',
field=models.IntegerField(blank=True, help_text='单位bytes', null=True, verbose_name='文件大小'),
),
migrations.AlterField(
model_name='complexphoto',
name='height',
field=models.IntegerField(blank=True, help_text='单位px', null=True, verbose_name='图片高度'),
),
migrations.AlterField(
model_name='complexphoto',
name='is_cover',
field=models.BooleanField(default=False, help_text='楼盘封面图(每楼盘唯一)', verbose_name='是否封面图'),
),
migrations.AlterField(
model_name='complexphoto',
name='sort_order',
field=models.SmallIntegerField(default=0, help_text='同类别内的排序顺序', verbose_name='排序顺序'),
),
migrations.AlterField(
model_name='complexphoto',
name='thumbnail_key',
field=models.TextField(blank=True, default='', verbose_name='缩略图路径'),
),
migrations.AlterField(
model_name='complexphoto',
name='width',
field=models.IntegerField(blank=True, help_text='单位px', null=True, verbose_name='图片宽度'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='avg_sale_price',
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:万元/套', max_digits=12, null=True, verbose_name='月均售价'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='avg_unit_price',
field=models.DecimalField(blank=True, decimal_places=2, help_text='单位:元/m²', max_digits=10, null=True, verbose_name='月均单价'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='price_trends', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='created_at',
field=models.DateTimeField(auto_now_add=True, verbose_name='创建时间'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='listing_count',
field=models.IntegerField(blank=True, null=True, verbose_name='当月挂牌套数'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='record_month',
field=models.DateField(help_text='统一存为该月1日如 2026-04-01', verbose_name='月份'),
),
migrations.AlterField(
model_name='complexpricetrend',
name='transaction_count',
field=models.IntegerField(blank=True, null=True, verbose_name='成交套数'),
),
migrations.AlterField(
model_name='complexschool',
name='complex',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='complex_schools', to='fonrey_complex.complex', verbose_name='所属楼盘'),
),
migrations.AlterField(
model_name='complexschool',
name='school',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='complex_links', to='region.school', verbose_name='对口学校'),
),
migrations.AlterField(
model_name='complexschool',
name='zone_type',
field=models.CharField(blank=True, choices=[('guaranteed', '对口'), ('reference', '参考'), ('lottery', '摇号')], default='', help_text='guaranteed=对口(直升) / reference=参考(可能入读) / lottery=摇号', max_length=30, verbose_name='学区类型'),
),
migrations.AlterField(
model_name='roomunit',
name='building',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='room_units', to='fonrey_complex.building', verbose_name='所属楼栋'),
),
migrations.AlterField(
model_name='roomunit',
name='display_no',
field=models.CharField(blank=True, default='', help_text='展示用完整房号如「3-1-101」', max_length=50, verbose_name='展示房号'),
),
migrations.AlterField(
model_name='roomunit',
name='floor',
field=models.SmallIntegerField(help_text='实际层数,地下为负数', verbose_name='楼层'),
),
migrations.AlterField(
model_name='roomunit',
name='floor_name',
field=models.CharField(blank=True, default='', help_text='如「1层」「B1层」', max_length=20, verbose_name='楼层名称'),
),
migrations.AlterField(
model_name='roomunit',
name='is_active',
field=models.BooleanField(default=True, help_text='FALSE=已拆除/不存在', verbose_name='是否启用'),
),
migrations.AlterField(
model_name='roomunit',
name='is_standard',
field=models.BooleanField(default=False, help_text='TRUE=已归一化为标准结构', verbose_name='是否标准化'),
),
migrations.AlterField(
model_name='roomunit',
name='room_no',
field=models.CharField(help_text='如「01」「101」', max_length=30, verbose_name='房号'),
),
]