2012-04-30 25 views
4

フィールドが返されたときにデフォルト値をオーバーライドできるかどうかは疑問です。Djangoモデル:フィールド戻り値のオーバーライド

modela_instance.name 

を呼び出すと、例の名前+「foo」というのため、変更された値を返すことができることをどのような方法があります

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

が、デフォルトで実行FOOを追加し、コードを持っている:私はモデルを持っていたと言いますモデル自体の中で、私がする必要があるのは、付加価値を得るために名前を呼び出すことだけです。

私は手の込んだと私が実際に行うことを望んだことはモデル内のメソッドを持っていると言う必要があります。「

def get_name(self): 
    return self.name + " foo" 

または同様、ちょうどget_name方法は、フィールドへの呼び出しを上書きすることを望みます名"。

答えて

10

はい、あなたはこの

class ModelA(models.Model) 
    _name = models.CharField(...) 

    def set_name(self, val): 
     self._name = "%s - foo" % val 

    def get_name(self): 
     return self._name 

    name = property(get_name, set_name) 
+0

ありがとう、私はわずかに異なるメソッドを使用して終了しました。今では、名前フィールドの代わりにメソッドを返す読み取り専用プロパティを使用しています。 – PT114

+0

http://stackoverflow.com/questions/3757951/changing-the-behaviour-of-a-django-model-with-getattrも参照してください。基本的には、プロパティや '__getattr__'(気を付けて!)を使用してください。 –

1

なぜこれをしたいと思う行うためにpropertiesを使用することができますか?

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s : foo" % self.name 

とちょうど使いの呼び出し::

modela_instanceを

を ...確かに、私は、これは良いアイデアだとは思わないしかし、あなたは、例えばUnicodeの方法を使用することができません

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def __unicode__(self): 
     return "%s : %s" % (self.name, self.make_foo()) 

    def make_foo(self): 
     return "foo" 

たり、独自のメソッドを定義:fooが持っている場合、または動的にする

class ModelA(models.Model) 
    name = models.CharField(max_length=30) 

    def alt_name(self): 
     return "%s : foo" % self.name 
+0

私のモデルの名前は、{ModelB:description}のような "tags"を含む文字列で構成されています。タグは、異なるモデルの属性に関連しています。そこで、{ModelB:description}は別のモデル "B"の記述属性を表す。私はこれらのタグを翻訳できるメソッドを持っていますが、名前が呼ばれる場所がたくさんあり、それらをすべて変更して変更することは実用的ではなく、modelbのdescription属性がmodelcのagに含まれていれば、 {ModelB:description}は、modelb記述が保持していたものの文字列タグを返すだけであるからです。 – PT114

関連する問題