0

私は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。代わりに、 CompositeFieldメソッドDollarField(dollar_value=Decimal('199.99'), dollar_year=2012)の戻り値である が表示されます。しかし、CompositeField をサブクラス化し、独自のメソッドを追加したので、Django は上書きしないのでしょうか? それとも私は何かを誤解していますか?__repr____unicode__

Python 2.7.3 および django-composite-field 0.1 で Django 1.5.4 を使用しています。

4

1 に答える 1

0

表示されているの__repr__は、実際には__repr__CompositeField ではなく、Proxy です (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__

于 2013-12-30T18:16:10.497 に答える