使用.values()时未调用django自定义字段to_python

时间:2014-12-16 06:37:05

标签: django python-2.7 django-orm

我有一个简单的自定义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 ......

1 个答案:

答案 0 :(得分:1)

它是一个known issue,虽然6年后仍然存在争议,但它是真正的错误还是文档错误。