2009-05-13 15 views
37

私は自分自身のためにブラウザを通って動作するローカルアプリで作業を始めました。最近、ジャンゴチュートリアルを進めてきたので、単純なPythonではなく、djangoを使うほうが良いかもしれないと思っています。1つのdjangoアプリで約20個のモデル

私には少なくとも20個のモデルがあり、それぞれに多くの機能があります。かなり単純に、1つの巨大なモデルファイルを作成し、おそらく巨大なビューも作成します。どのように分割するのですか?

models are all related私は単純に別々のアプリにすることはできませんか?

答えて

30

「私は、少なくとも20個のモデルを持っている」 - これはおそらく、複数のDjangoの「アプリ」で、より多くのいくつかの小さな「アプリケーション」とジャンゴ「プロジェクト」のようなものです

を、私は話題を中心に物事を分割したいですまたは少数(1〜5)のモデルを持つサブジェクトエリア。これはDjangoの "app"になり、再利用の役に立つ単位です。

「プロジェクト」全体は、別々の部分で構成された統合されたものを提示するアプリの集まりです。

これはプロジェクト管理に役立ちます。これは、各「アプリ」が最後にリリースされたスプリントになる可能性があるためです。

+1

しかし、モデル同士を関連付ける必要がある場合は、どうすれば別のアプリに配置できますか? – Teifion

+2

1つのモデルは別のパッケージのモデルを簡単に参照できます。ほとんどの場合、「高レベル」と「低レベル」のモデルがあります。 1つのアプリケーションで下位レベルのモデルを実装します。より高いレベルのアプリケーションは、より低いレベルのアプリケーションのモデルに依存することができます。 –

+13

django.contrib.authのUserモデルに外部キーを設定するときはいつでも、別々のアプリケーションに関係しています... –

0

複数のファイルでモデルを分割することができます。これもビューのために行く。

0

を別々のファイルに分割し、メインのmodels.pyフィールドの上部にインポートするだけです。

あなたが本当にを希望するかどうかは、別の質問です。です。

+0

Jarret Hardie氏によると、モデルと呼ばれるPythonパッケージ(つまり、__init__.pyファイルを含むディレクトリ)を作成することがこれを実行する最良の方法です。 –

69

これはかなり一般的な必要性である...私はあなたがmodels.pyファイルを分割(とあまりにものviews.py)することができます10,000行の長:-)

だmodels.pyファイルを介してウェーディングを想像することはできませんpacakgeへ。 __init__.pyファイルがパッケージにフォルダを作る

/my_proj 
    /myapp 
     /models 
      __init__.py 
      person.py 

:この場合、あなたのプロジェクトツリーは次のようになります。それが終わっています一度

class Person(models.Model): 
    name = models.CharField(max_length=128) 

    class Meta: 
     app_label = 'myapp' 

、あなたの__init__.pyでモデルをインポートします。唯一の落とし穴は、モデルのapp_labelを示し、あなたのモデルのための内部Metaクラスを定義してくださいするそうDjangoはトラブルあなたのスキーマを構築する必要がありますですジャンゴと同期DBはそれを見つけるようにファイル:

from person import Person 

することができます。この方法はまだfrom myapp.models import Person

+0

これは理論的には動作していますが、チュートリアル「python manage.py sql gui」の行を実行しても何も起こりません。 – Teifion

+1

これは、通常、djangoがモデルを見つけることができないことを意味します。 models.__init__.pyファイルにインポートがあることを確認し、各モデルにapp_labelを設定していることを確認してください。また、古いmodels.pyファイルを削除したことを確認してください。 –

+11

これは技術的には正しいですが、実はそれほど悪い考えではありません。 models.pyを分割するのに十分なモデルがあれば、複数のアプリに分割する必要があります。 –

16

のモデルがありませんすべての関連するので私は傾ける 別のアプリに単にそれらを作る できますか?

を別々のアプリに分けます。別のアプリのあるアプリでモデルを使用するには、django.contribアプリをインポートするのと同じ方法でそのモデルをインポートします。

+14

+1。お互いに依存してアプリに対する法律はありません。 – muhuk

5

1つのアプリで20個のモデルを持つことは、小さなもので分割する必要があるという兆候かもしれません。

Djangoアプリの目的は、小さな一目瞭然のコードを持つことです。

電子商取引サイトをお持ちの場合は、shopping_cartアプリ、請求アプリケーションなどがあります。

お互いに依存しているアプリは本当に問題ありません(デカップリングが可能な方が良いですが)が、アプリケーションには2つの非常に異なることがあってはいけません。

記事Django tips: laying out an applicationがお役に立てます。いつものように、あなたが読んだすべてのものを塩の穀物(この答えを含む)で取りなさい。

関連する問題