10

Django モデルのインスタンスにカスタム属性を追加したいと考えています。これらの属性はデータベースに保存しないでください。他のクラスでは、属性は__init__メソッドによって単純に初期化されます。

すでに 3 つの異なる方法があることがわかっていますが、どれも完全に満足できるものではありません。それを行うためのより良い/よりpythonic/djangoistな方法があるのだろうか?

  1. メソッドをオーバーライド__init__ます。構文は少し複雑ですが、機能します。

    from django.db.models import Model
    
    class Foo(Model):
      def __init__(self, *args, **kwargs):
         super(Model, self).__init__(*args, **kwargs)
         self.bar = 1
    
  2. Djangopost_initシグナルを使用します。これはクラス定義の外にあるクラス コードを使用するため、あまり読みにくくなります。

    from django.dispatch import receiver
    from django.db.models.signals import post_init
    @receiver(post_init, sender=Foo)
        def user_init(sender, instance, *args, **kwargs):
          instance.bar = 1
    
  3. 属性の代わりにインスタンス メソッドを使用します。デフォルトの動作として一般的な例外が発生するのは、少し厄介です。

    class Foo(Model):
      def bar(self):
        try:
          return self.bar
        except:
          self.bar = 1
        return self.bar
    

これらの 3 つの選択肢のうち、最初の選択肢は、私にとって最も悪いものではないように見えます。どう思いますか?代替案はありますか?

4

2 に答える 2

9

Pythonで利用可能なプロパティデコレータを使用します

class Foo(Model):
    @property
    def bar(self):
        if not hasattr(self, '_bar'):
            self._bar = 1

        return self._bar

次に、() で関数を呼び出す代わりに、プロパティのようにアクセスできます。

保存する代わりにフォールバックを組み込むことで、これをもう少し簡単にすることもできます

class Foo(Model):
    @property
    def bar(self):
        return getattr(self, '_bar', 1)
于 2013-01-22T16:37:44.633 に答える
3

オーバーライド__init__は正しい方法です。

于 2013-01-22T18:05:29.460 に答える