Django CompositeField子类未覆盖unicode方法

2024-09-30 06:11:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用django-composite-field创建一个货币字段,其中既包括美元值,也包括美元年(即“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()

当我访问ProductStandard实例的price属性时,我希望看到这样的格式化字符串:2012$: $199.99。相反,我看到DollarField(dollar_value=Decimal('199.99'), dollar_year=2012),它是the CompositeField ^{} method的返回值。但既然我已经对CompositeField进行了子类化并添加了我自己的__unicode__方法,Django不应该重写吗?还是我误解了什么?在

我将Django 1.5.4与python2.7.3和Django复合字段0.1一起使用。在


Tags: djangoselffalsefieldvaluemodelsunicodeyear
1条回答
网友
1楼 · 发布于 2024-09-30 06:11:30

您看到的__repr__实际上不是CompositeField的__repr__,而是它的代理(参见composite_字段/基准.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__,而不是{}。区别在于:

^{pr2}$

将调用__repr__,而

print(unicode(mymodel.price))

将调用__unicode__方法。在

相关问题 更多 >

    热门问题