5

私はDjangoのドキュメントで見ます:

モデル インスタンス リファレンス : オブジェクトの作成

__init__メソッドをオーバーライドしてモデルをカスタマイズしたくなるかもしれません。ただし、変更するとモデル インスタンスが保存されなくなる可能性があるため、呼び出し元の署名を変更しないように注意してください。
をオーバーライドするのではなく、__init__次のいずれかの方法を試してください。

  • モデル クラスにクラスメソッドを追加します。
  • カスタム マネージャーにメソッドを追加する(通常は推奨)

2番目の解決策が「通常好まれる」のはなぜですか?

リレーションを介してモデルBを拡張するモデルがあり、対応するオブジェクトも生成するオブジェクトを生成するメソッドを作成したい状況では、提案されているようにカスタムマネージャーを使用するのが「より良い」方法です。おそらく、このマネージャは、デフォルトのマネージャによって提供されるもの以外には使用しないでしょうか?AOneToOneBA

4

1 に答える 1

5

コードがきれいに見えるので、好ましいと思います。利点や違いはそれほど大きくないため、強調を少し読みすぎている可能性もあります。そうは言っても、自分で物事を実装するときは、提案されたアプローチを使用します。

次のモデルを検討してください (純粋に説明目的のため)。

class Vehicle(models.Model):
    wheels = models.IntegerField()
    color = models.CharField(max_length=100)

アプリケーションでは、すべての車、すべてのオートバイ、またはあらゆる種類の車両を取得する必要が生じることがよくあります。物事を DRY に保つには、このデータを取得するための標準的な形式が必要です。クラス メソッドを使用すると、次のようになります。

class Vehicle(models.Model):
    #(...)
    @classmethod
    def cars(cls):
        return Vehicle.objects.filter(wheels=4)

cars = Vehicle.cars()
green_cars = Vehicle.cars().filter(color='green')

マネージャーを作成すると、次のようになります。

class CarManager(models.Manager):
    def get_query_set(self):
        return super(CarManager, self).get_query_set().filter(wheels=4)

class Vehicle(models.Model):
    #(...)
    car_objects = CarManager()

cars = Vehicle.car_objects.all()
green_cars = Vehicle.car_objects.filter(color='green')

私の意見では、特に物事がより複雑になると、後者の方がきれいに見えます。モデル定義が煩雑になるのを防ぎ、デフォルトのobjectsマネージャーを使用するのと同様のことを維持します。

于 2013-08-08T15:14:23.387 に答える