Може да искате да замените 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