У меня есть поле пользовательской модели YearWithSurenessField
, которое представлено в python пользовательским типом данных YearWithSureness
.Конструктор для YearWithSureness
равен YearWithSureness(year='', is_certain=False)
, где year
равен либо ''
, либо четырехзначному году (в виде строки), а is_certain
является логическим значением, представляющим, уверен ли я, что данноегод правильный.Поля модели этого типа хранятся в моей базе данных в форме year / is_termin , например, "2008 / True", "2011 / False", "/ False" и т. Д.
КакНапример, в модели Member
у меня есть поле grad_year = YearWithSurenessField(...)
, в котором хранится год выпуска участника, а также то, знаю ли я точно, что год, который я сохранил, правильный.
Что бы яЯ хотел бы иметь возможность использовать что-то вроде
Member.objects.filter(grad_year__year=2011)
, чтобы получить QuerySet
всех Участников, чей grad_year равен либо «2011 / True», либо «2011 / False».Точно так же я хотел бы иметь возможность использовать что-то вроде
Member.objects.filter(grad_year__range=(2000, 2011))
, чтобы получить QuerySet
всех Участников, чей grad_year находится в диапазоне от 2000 до 2011 года, независимо от того, является ли grad_year.is_certain
Истиной илиНеверно.
Возможно ли это?Я знаю, что мог бы использовать Member.objects.filter (grad_year__contains = "2011"), чтобы получить первый результат, но я хотел бы иметь возможность использовать __year.
Вот соответствующие классы, обрезанныепостороннего кода:
class YearWithSureness(object):
def __init__(self, year='', is_certain=False):
# ...
def __str__(self):
return "{year}/{is_certain}".format(year=self.year,
is_certain=self.is_certain)
class YearWithSurenessField(models.Field):
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
# ...
def to_python(self, value):
# ...
def get_prep_value(self, value):
# ...
def get_prep_lookup(self, lookup_type, value):
if lookup_type in ('month', 'day'):
raise TypeError('Lookup type {0} not supported.'.format(lookup_type))
else:
return super(YearWithSurenessField, self).get_prep_lookup(lookup_type, value)
def value_to_string(self, obj):
# ...