Django EmbeddedField因字段与列名不一致触发验证错误的解决方法
解决Djongo EmbeddedField字段名与db_column不一致的验证错误
问题根源是Djongo原生EmbeddedField会强制验证容器模型的字段名与db_column必须一致,而你的场景需要模型保留snake_case的name,同时适配数据库中已有的camelCaseName字段。可以通过自定义字段跳过该验证逻辑来解决:
步骤1:创建自定义EmbeddedField
继承Djongo的EmbeddedField,重写_validate_container方法,移除字段名与db_column的一致性检查:
from django.db import models from djongo.models.fields import EmbeddedField from django.core.exceptions import ValidationError class CustomEmbeddedField(EmbeddedField): def _validate_container(self, model_container): # 保留基础验证:确保容器是Model子类 if not issubclass(model_container, models.Model): raise ValidationError( 'Model container must be a subclass of models.Model' ) # 跳过字段名与db_column不一致的检查(原验证逻辑就在此处) return model_container
步骤2:在模型中使用自定义字段
将Entry模型中的EmbeddedField替换为自定义的CustomEmbeddedField:
class Blog(models.Model): _id = models.ObjectIdField() name = models.CharField(max_length=100, db_column="Name") tagline = models.TextField() class Entry(models.Model): _id = models.ObjectIdField() blog = CustomEmbeddedField( model_container=Blog )
此方案既保留了模型字段的snake_case命名规范,又能正确映射数据库中已有的camelCase字段,同时绕过了Djongo的强制验证逻辑。
内容的提问来源于stack exchange,提问作者StuffHappens
相关产品推荐
相关产品推荐

