2011-11-23 13 views
5

私はthis pageを読むが、機能を埋め込む際に使用するために取得していないとlinking.Iを使用する私はmodels.pyファイルをジャンゴでプロジェクトをMongoDB.In使用していているため、私はモデルを次ていますVsを埋め込むMongoDBにリンクする。埋め込むときとリンクするとき?

class Projects(models.Model): 
    projectName =models.CharField(max_length = 100,unique=True,db_index=True) 
    projectManager = EmbeddedModelField('Users') 

class Teams(models.Model): 
    teamType = models.CharField(max_length =100) 
    teamLeader = EmbeddedModelField('Users') 
    teamProject = EmbeddedModelField('Projects') 
    objects = MongoDBManager() 

class Users(models.Model): 
    name = models.CharField(max_length = 100,unique=True) 
    designation = models.CharField(max_length =100) 
    teams = ListField(EmbeddedModelField('Teams')) 



class Tasks(models.Model): 
    title = models.CharField(max_length = 150) 
    description = models.CharField(max_length=1000) 
    priority = models.CharField(max_length=20) 
    Status = models.CharField(max_length=20) 
    assigned_to = EmbeddedModelField('Users') 
    assigned_by = EmbeddedModelField('Users') 
    child_tasks = ListField() 
    parent_task = models.CharField(max_length = 150) 

私は埋め込みを行う場合、すべてのモデルでオブジェクトを更新する必要があります。「ユーザー」の名前を更新する場合と同様に、プロジェクト、チーム、ユーザー、およびタスクのモデルに対して更新プログラムを実行する必要があります私の場合はリンクが良いでしょうか?

答えて

3

まず、概念的には、モデルクラスを特異なオブジェクトと名付けます。

ユーザーはチームがチーム...複数のオブジェクトが作成されるから、金型などのモデルの

考えるべきであり、ユーザーである必要があります。ユーザモデルはユーザを生成し、各ドキュメント/行がユーザオブジェクトであるユーザと呼ばれるテーブルに格納される。

あなたの質問に関しては、hymlothはまさに正しいです。埋め込み型ではなくドキュメントへの参照を作成する方法は、ユーザーのコレクション内のユーザーのIDを参照するように、これらの特定のフィールドを変更することです。そうすれば、ユーザー文書のコピーではなく、参照するIDを格納するだけです。参照文書を変更すると、それも参照されているすべての場所で変更されます。

私はDjango-mongoDBのフィールドを見ていませんでしたが、この目的のために伝統的なdjango ForeignKeyフィールドを使用できます。私はあなたがミックスとマッチすることができますので、ショットを与えるかどうかは分かりません。例えば

、あなたのチームのクラスは次のようにフィールドを持っているでしょう:

teamLeader = ForeignKey(User) 

はそれが動作するかどうか私に教えてください。

4

例では、ユーザーの名前を変更すると、埋め込みを使用する場合、他のすべてのドキュメントを追加の手順で更新する必要があることを意味します。あなたの状況に適しているのはリンク(参照)です。これにはクエリ時に余分なステップが必要ですが、特定の "ビジネスロジック"のために、それが優れています。

一般的に、特定のドキュメントを複数の異なる場所からアクセスする必要がある場合、埋め込まれているのではなく、参照することが理にかなっています。同じことが、文書が頻繁に変更される状況にも当てはまります。

+0

私に例を示すことができますか?私はあなたに感謝します:) – Anshul

+0

あなたのすべてのEmbeddedModelField( 'Users')をReferenceField( 'Users')に置き換えてください。 – hymloth

+0

しかし、私はDjango-mongoDBエンジンを使用しており、ReferenceFieldのようなフィールドはありません。 : – Anshul

関連する問題