我似乎偶然发现了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返回自定义类型?
答案 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