20

これはかなり簡単なジャンゴパターンの質問です。私のマネージャーコードは通常models.pyにありますが、models.pyが本当に巨大な場合はどうなりますか?メンテナンス性と循環的なインポートを避けるために、マネージャーコードをmodels.pyに保存させるための他の代替パターンはありますか?djangoのマネージャーコードはどこにありますか?

なぜmodels.pyが巨大なのかという質問が出るかもしれませんが、大きさとユーティリティの幅が正当であると仮定しましょう。

答えて

21

models.pyのモデルとmanagers.pyのフォーム(forms.pyのフォーム)は、すべて同じアプリケーション内に保存することをお勧めします。より一般的な管理者にとっては、他のアプリで再利用できるかどうかをcore.managersに保存することをお勧めします。モデル/ modelname.pyを持つ私たちのより大きなアプリの中には、マネージャーと悪く見えないモデルコードが含まれているものがあります。

+1

それでは、どうやってmodels.pyをimportする必要があるmodels.pyとどうやってやりとりしますか? – Jeff

+24

managers.pyはモデルをインポートする必要はありません。問題のモデルは常にマネージャ上で 'self.model'として利用できます。 – jacobian

+5

あなたのマネージャのQuerySetが別のモデルを参照する必要がない限り、それをインポートすることはできず、models.pyに入れなければなりません(例えば、別のモデルに存在するアイテムを除外する場合など)。 –

3

Djangoアプリケーションを構築するときに、特定のモデルコード、マネージャコード、時にはコードを含む[modelname] .pyファイルを作成し、__init__.pyファイルを使用してmodelsディレクトリ内のすべてをインポートすることができました。これは私がそれを経営可能に保つことにおいて少なくとも打ち勝ちました。

+0

私がこれを行うつもりなら、これらのファイルをすべて 'models'フォルダに入れます。それは、アプリケーションのルートをきれいにし、より良い輸入を整理します。 – jangeador

6

私は常にmanagers.pyに私を配置します。循環インポートの問題がある場合は、a)self.modelのマネージャのモデルクラスを参照できます。b)関数内でインポートを実行できます。

+0

+1は、関数の内部でインポートできることを思い出させるためのものです。私の場合は、私のマネージャーのために外部モデルを使用しなければなりませんでした。メソッドの中に '' apps.get_model(app_label = 'app_name'、model_name = 'model_name') ''を追加しました – jangeador

7

大規模なモデルを使用すると、djangoモジュールを活用して、単にmodelsという名前のフォルダを作成することをお勧めします。古いmodels.pyをこのモデルフォルダに移動し、名前を__init__.pyに変更します。これにより、各モデルをこのモデルフォルダ内のより特定のファイルに分けることができます。

これで、各モデルを__init__.pyの名前空間にインポートするだけで済みます。次に、あなたの__init__.pyがちょうどすることができ

yourapp/ 
    models/ 
     __init__.py # This file should import anything from your other files in this directory 
     basic.py # Just an example name 
     morespecificmodels.py # Just an example name 
     managers.py # Might want to separate your manager into this 

だから、例えば、あなたがに分離することができます。これは、私のモデルファイルを取得するときに私が使用した構造である

from basic import * # You should replace * with each models name, most likely. 
from managers import YourManager # Whatever your manager is called. 

巨大なものですが、プラグイン可能なアプリケーションを可能な限り頻繁に分離しようとしています。

これが役に立ちます。

関連する問題