【发布时间】:2011-05-14 00:40:13
【问题描述】:
我有一个自定义模型字段 YearWithSurenessField,它在 python 中由自定义数据类型 YearWithSureness 表示。 YearWithSureness 的构造函数是 YearWithSureness(year='', is_certain=False),其中 year 是 '' 或四位数年份(作为字符串),is_certain 是一个布尔值,表示我是否确定给定的年份是正确的。这种类型的模型字段以 year/is_certain 的形式存储在我的数据库中,例如“2008/True”、“2011/False”、“/False”等
例如,在 Member 模型中,我有一个字段 grad_year = YearWithSurenessField(...) 存储成员的毕业年份以及我是否确定我存储的年份是正确的。
我想做的是使用类似的东西
Member.objects.filter(grad_year__year=2011)
获取所有 grad_year 为“2011/True”或“2011/False”的成员的QuerySet。同样,我希望能够使用类似的东西
Member.objects.filter(grad_year__range=(2000, 2011))
获取所有 grad_year 在 2000 到 2011 范围内的成员的 QuerySet,无论 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):
# ...
【问题讨论】:
-
您应该只使用接受范围参数的自定义管理器。
标签: python django django-models django-queryset