我有一个自定义模型字段YearWithSurenessField
,它在python中由自定义数据类型YearWithSureness
表示。 YearWithSureness
的构造函数是YearWithSureness(year='', is_certain=False)
,其中year
是''
或四位数年份(作为字符串),并且is_certain
是一个布尔值,代表我是否确定给定的一年是正确的。这种类型的模型字段以年/ is_certain的形式存储在我的数据库中,例如, “2008/True”,“2011/False”,“/ False”等。为自定义Django模型字段定制字段查找功能
作为示例,在Member
模型中,我有一个字段grad_year = YearWithSurenessField(...)
,它存储了成员的毕业年份以及我是否知道确定我存储的年份是正确的。
我想什么,能够做的是使用像
Member.objects.filter(grad_year__year=2011)
收获的人,其grad_year要么是“2011 /真”或“2011 /假”所有成员的QuerySet
。同样,我希望能够使用像
Member.objects.filter(grad_year__range=(2000, 2011))
收获的人,其grad_year是在2000年的范围内通2011不论是否grad_year.is_certain
是真还是假所有成员的QuerySet
。
这可能吗?我知道我可以使用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):
# ...
您应该只使用接受ranges参数的自定义管理器。 – 2011-05-14 01:11:15