如何将MariaDB生成列映射到Django,或通过迁移创建该列?
Django映射MariaDB存储型生成列的解决方案
场景1:数据库已存在生成列,映射到Django模型
如果数据库中已经创建了fiscal_number存储型生成列及索引,只需在Django模型中添加对应字段并配置参数,让ORM识别该列:
- 修改
OperatorTaxInfo模型,添加映射字段:
from django.db import models class OperatorTaxInfo(models.Model): data = models.JSONField() # 映射数据库已有的存储型生成列 fiscal_number = models.CharField( max_length=255, editable=False, # 禁止Django修改该字段,由数据库维护 generated=True, # 标记为数据库生成列 db_persist=True, # 对应MariaDB的STORED类型(虚拟列设为False) db_column='fiscal_number' # 指定数据库列名,确保匹配 ) class Meta: db_table = 'operator_tax_info'
- 生成并标记迁移为已应用:
- 生成迁移文件:
python manage.py makemigrations your_app --name map_fiscal_number - 因为列已存在,用
--fake跳过实际数据库操作:python manage.py migrate your_app --fake
- 生成迁移文件:
完成后,即可通过模型字段直接过滤,比如OperatorTaxInfo.objects.filter(fiscal_number='XXX'),ORM会直接调用索引列,避免JSON解析的性能损耗。
场景2:通过Django迁移生成列及索引
如果需要从0开始用Django迁移创建生成列和索引,按以下步骤操作:
- 定义模型字段及索引:
from django.db import models class OperatorTaxInfo(models.Model): data = models.JSONField() fiscal_number = models.CharField( max_length=255, editable=False, generated=True, db_persist=True, db_column='fiscal_number', # 指定MariaDB生成列的表达式,与原生SQL一致 db_expression="json_unquote(json_extract(`data`,'$.fiscal_number'))" ) class Meta: db_table = 'operator_tax_info' # 为生成列创建索引 indexes = [ models.Index(fields=['fiscal_number'], name='idx_fiscal_number') ]
- 执行迁移:
- 生成迁移文件:
python manage.py makemigrations your_app - 运行迁移创建列和索引:
python manage.py migrate your_app
- 生成迁移文件:
关键注意事项
- 确保使用Django 3.2+及MariaDB 10.2+,两者对存储型生成列的支持完善。
- 映射完成后,所有针对
fiscal_number的过滤、排序操作都会直接利用数据库索引,性能与普通列一致,完全避免@property带来的全表扫描问题。 - 不要修改
fiscal_number字段的值,它由数据库自动从data字段同步维护。
内容的提问来源于stack exchange,提问作者Lmex89
相关产品推荐
相关产品推荐

