我正在使用django-composite-field创建一个包含dollar_value和dollar_year的货币字段(即“2008美元200美元”)。
我在Django应用程序中有以下模型:
#models.py
from composite_field import CompositeField
class DollarField(CompositeField):
""" Composite field to associate dollar values with dollar-years."""
dollar_value = models.DecimalField(max_digits=8, decimal_places=2)
dollar_year = models.PositiveSmallIntegerField(
blank=False,
null=False,
validators=[
MinValueValidator(1980),
MaxValueValidator(2020)])
def __unicode__(self):
return self.dollar_year+"$: $"+self.dollar_value # "2012$: $149.95"
class ProductStandard(models.Model):
product = models.ForeignKey(Product)
standard_level = models.ForeignKey(StandardLevel)
price = DollarField()
当我访问price
实例的ProductStandard
属性时,我希望看到这样的格式化字符串:2012$: $199.99
。相反,我看到DollarField(dollar_value=Decimal('199.99'), dollar_year=2012)
,这是the CompositeField __repr__
method的返回值。但是因为我已经将CompositeField子层化并添加了我自己的__unicode__
方法,所以Django不应该覆盖吗?或者我误解了什么?
我正在使用Django 1.5.4和Python 2.7.3以及django-composite-field 0.1。
答案 0 :(得分:0)
您看到的__repr__
实际上不是CompositeField的__repr__
,而是它的代理(请参阅composite_field / base.py,第104行)。因此,您必须提供自己的代理,并在那里覆盖__repr__
方法,如下所示:
class DollarField(CompositeField):
""" Composite field to associate dollar values with dollar-years."""
dollar_value = models.DecimalField(max_digits=8, decimal_places=2)
dollar_year = models.PositiveSmallIntegerField(
blank=False,
null=False,
validators=[
MinValueValidator(1980),
MaxValueValidator(2020)])
def get_proxy(self, model):
return DollarField.Proxy(self, model)
class Proxy(CompositeField.Proxy):
def __repr__(self):
return "%s$: $%s" % (self.dollar_year, self.dollar_value) # "2012$: $149.95"
当然,如果您希望保留__repr__
原样,可以覆盖__unicode__
代替__repr__
,就像您一样。区别在于:
print(mymodel.price)
会调用__repr__
,而
print(unicode(mymodel.price))
会调用__unicode__
方法。