values_list在自定义模型字段中不使用to_python?

时间:2012-01-17 07:37:16

标签: django django-models

我似乎偶然发现了Django自定义模型字段中的怪癖。我有以下自定义modelfield:

class PriceField(models.DecimalField):
    __metaclass__ = models.SubfieldBase

    def to_python(self, value):
        try:
            return Price(super(PriceField, self).to_python(value))
        except (TypeError, AttributeError):
            return None

    def get_db_prep_value(self, value):
        return super(PriceField, self).get_db_prep_value(value.d if value else value)

    def value_to_string(self, instance):
        return 'blah'

哪个应该总是返回python中的自定义Price类。这按预期工作:

>>> PricePoint.objects.all()[0].price
Price('1.00')

但是,当以values_list的形式检索价格时,我会得到小数:

>>> PricePoint.objects.all().values_list('price')
[(Decimal('1'),)]

然后,如果我将DB类型更改为foat并再试一次,我会得到一个浮点数:

>>> PricePoint.objects.all().values_list('price')
[(1.0,)]
>>> type(PricePoint.objects.all().values_list('price')[0][0])
<type 'float'>

这让我觉得values_list根本不依赖于to_python而只是返回数据库中定义的类型。那是对的吗?有没有办法通过values_list返回自定义类型?

2 个答案:

答案 0 :(得分:3)

回答了我自己的问题:这显然是一个Django错误。 values_list不反序列化数据库数据。

正在此处跟踪:https://code.djangoproject.com/ticket/9619并正在等待设计决策。

答案 1 :(得分:0)

请注意,这已在Django 1.8中通过在自定义字段上添加from_db_value方法得到解决。

请参阅https://docs.djangoproject.com/en/1.8/howto/custom-model-fields/#converting-values-to-python-objects