Вы можете переопределить to_python
, что позволит вам сравнивать нестрочные строки при поиске в базе данных. Фактический метод — get_prep_value
, но поскольку он вызывает to_python
вместо CharField
, его удобнее переопределить:
def to_python(self, value):
value = super(LowerCaseCharField, self).to_python(value)
if isinstance(value, basestring):
return value.lower()
return value
Теперь вы можете выполнять такие запросы, как:
MyModel.objects.filter(lccf="MiXeD")
Изменить:
Перечитывая ваш вопрос, похоже, вы хотите, чтобы снижение вступило в силу немедленно. Для этого вам потребуется создать дескриптор (объект Python в новом стиле с методами __get__
и __set__
, см. документы Python и код django для связанных моделей) и переопределите contribute_to_class
в поле, чтобы установить поле модели в соответствии с вашим дескриптором.
Вот полный пример из моей головы, который должен быть повторно использован для всех полей, которые хотят изменить значение при настройке.
class ModifyingFieldDescriptor(object):
""" Modifies a field when set using the field's (overriden) .to_python() method. """
def __init__(self, field):
self.field = field
def __get__(self, instance, owner=None):
if instance is None:
raise AttributeError('Can only be accessed via an instance.')
return instance.__dict__[self.field.name]
def __set__(self, instance, value):
instance.__dict__[self.field.name] = self.field.to_python(value)
class LowerCaseCharField(CharField):
def to_python(self, value):
value = super(LowerCaseCharField, self).to_python(value)
if isinstance(value, basestring):
return value.lower()
return value
def contribute_to_class(self, cls, name):
super(LowerCaseCharField, self).contribute_to_class(cls, name)
setattr(cls, self.name, ModifyingFieldDescriptor(self))
person
Will Hardy
schedule
28.02.2010