2012-01-17 50 views
4

我似乎偶然发现了Django自定义模型字段中的一个怪癖。我有以下自定义模式字段:values_list在自定义模型字段中不使用to_python?

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返回自定义类型?

回答

相关问题