2017-02-25 6 views
0

みなさんこんにちは皆さんはDjango Frameworkを使い始めました。質問があります。各クラスモデルのmodels.pyの__str__関数の再利用方法

Djangoのドキュメントには、私は私のオブジェクトの文字列値を返すように関数を記述する必要があり、クラスの終わりにクラス(モデル)を作成するとき、それはすべてがこのようになり、言う:私が書いたこの場合

class NameClass(models.Model): 
    field_name_1 = models.SomeTypeField() 
    field_name_2 = models.SomeTypeField() 
    field_name_3 = models.SomeTypeField() 
    ... 
    field_name_n = models.SomeTypeField() 
    def __str__(self): 
     return self.field_name_1, ...self.field_name_n 

文字列の値を返すための関数、私のモデルに多くのフィールドがあり、__str__関数のそれぞれのそれらを書くのは、多くの作業になります。だから私の機能は次のようになります:

def __str__(self): 
    fields ='' 
    for x in self._meta.fields: 
     fields = fields + string.split(str(x),".")[2]+' ' 
    return fields 

今質問です。この関数をコピーしないでmodel.pyの各クラス(モデル)でこの関数を再利用するにはどうすればいいですか?

たとえば、

class FirstModel(models.Model): 
    ... 
    def __str__(self): 
     ... 
class SecondModel(models.Model): 
    ... 
    def __str__(self): 
     ... 

class ThirdModel(models.Model): 
    ... 
    def __str__(self): 
     ... 
class EtcModel(models.Model): 
    .... 
    def __str__(self): 

そして、それを解決するために、グローバル関数または別の方法のようにそれを使用するいくつかの方法が存在する可能性がある私は、コピーが私の関数毎回を貼り付けたくない:私はクラス(mdoels)がたくさんあります。

+0

ようこそStackOverflow! – frederick99

答えて

0

あなたは(あなたが欲しい__str__方法を提供し、一つのベースクラスから自分の異なるクラスを継承)継承を使用することができます。

これがうまくいかず、可能な限り簡単にこのメソッドの実装を共有したい場合は、定義する代わりにクラスにメソッドを割り当てることができます。

def mystrfunction(self): 
    return whatever 

class Class1(object): 
    ... 
    __str__ = mystrfunction 

class Class2(object): 
    ... 
    __str__ = mystrfunction 
0

外では、関数を定義し、クラス内

def foo(obj): 
    fields ='' 
    for x in obj._meta.fields: 
     fields = fields + string.split(str(x),".")[2]+' ' 
    return fields 

class FirstModel(models.Model): 
    ... 
    __str__ = foo 
+1

クレジット: '__str__ = foo'のkhelwood。 – frederick99

+0

私は冗長バージョンを使用しました。 'if(a == b)と同様にtrueを返します。そうでない場合はfalseを返します。 ' – frederick99

+0

@downvoter' def __str __(self):return foo(self) 'では間違っていませんでした。 – frederick99

0

あなたのクラスは、同じメソッドを共有する場合は、ミックスインを使用することができます。同じフィールドとメソッドを共有するすべてのモデルの

class BaseMixin(object): 
    def __str__(self): 
     return self.something 

class Foo(BaseMixin, models.Model): 
    # ... 

を、あなたはabstract base class例えば作成することができます。

class Base(models.Model): 
    class Meta: 
     abstract = True 
    title = models.CharField(max_length=255) 

    def __str__(self): 
     return self.title 


class Foo(Base): 
    # ... 
関連する問題