我有一个简单的自定义PctField,它只是将值乘以100,或者如果它为null则将其设置为0.0。这在我的代码中工作正常,如:
class PctField(models.FloatField):
__metaclass__ = models.SubfieldBase
def __init__(self, *args, **kwargs):
kwargs['blank'] = True
kwargs['null'] = True
super(PctField, self).__init__(*args, **kwargs)
def to_python(self, value):
if value is None:
return 0.
return value * 100
class TestModel(models.Model):
id = models.IntegerField(primary_key=True)
non_pct = models.FloatField(blank=True, null=True)
pct = PctField()
test = TestModel.objects.get(id=18328)
print test.non_pct, test.pct # prints 0.900227, 90.0227
test1 = TestModel.objects.filter(id=18328)
print test1[0].non_pct, test1[0].pct # prints 0.900227, 90.0227
稍后在我的代码中,我试图限制我返回的数据,所以我决定开始在结果上使用.values()并传入我需要的动态字段列表。当我这样做时,我的自定义字段中的to_python函数不再被调用。
test2 = TestModel.objects.filter(id=18328)
print test2.values(*['non_pct', 'pct'])[0] # prints {'non_pct': 0.900227, 'pct': 0.900227}
之前有其他人见过吗?我正在使用django 1.6.8 ......