正确的方法是定义自定义模型字段:
from django.db import models
from django.utils.six import with_metaclass
class UpperCharField(with_metaclass(models.SubfieldBase, models.CharField)):
def __init__(self, *args, **kwargs):
self.is_uppercase = kwargs.pop('uppercase', False)
super(UpperCharField, self).__init__(*args, **kwargs)
def get_prep_value(self, value):
value = super(UpperCharField, self).get_prep_value(value)
if self.is_uppercase:
return value.upper()
return value
并像这样使用它:
class MyModel(models.Model):
razao_social = UpperCharField(max_length=50, uppercase=True)
# next field will not be upper-cased by default (it's the same as CharField)
nome_fantasia = UpperCharField(max_length=50)
# etc..
您还需要通过添加以下代码来解决南迁移问题(如有必要):
from south.modelsinspector import add_introspection_rules
add_introspection_rules([
(
[UpperCharField],
[],
{
"uppercase": ["uppercase", {"default": False}],
},
),
], ["^myapp\.models\.UpperCharField"])
(最后一行的路径取决于字段类本地化。请阅读南文档以获取解释。)
尽管例如使用 shell 创建模型对象并将其保存在变量中时存在一个小缺点:
my_object = MyModel.objects.create(razao_social='blah')
print my_object.razao_social
你不会得到大写的价值。您需要从数据库中检索对象。当我发现如何解决这个问题时,我会更新这篇文章。