2011-07-12 9 views
1

投稿のリストに1つ以上のカテゴリを割り当てる必要がありました。私は最初にDjangoに多数の私は元のテーブルで何をしたのかを再現することはできませんでした。Djangoの多くのフィールドの代わりに別のテーブルを使うべきでしょうか

私の質問は、手動でリレーションシップテーブルを作成する代わりに多対多フィールドを使用する利点がありますか?もっと良いのであれば、Djangoで多対多のフィールドを提出して取り出す例がありますか? Many-to-Many relationships上のDjangoのドキュメントから

+0

答えを見つけましたか? –

答えて

0

あなたが唯一の なピザとトッピングを混合し、一致するような単純な多対多の関係を扱っている場合は、標準のManyToManyField はあなたが必要とするすべてです。ただし、データ と2つのモデル間の関係を関連付ける必要が生じることがあります。

要するに

あなたが単純な関係を持っている場合は、多くの-To_Manyフィールドは(あなたのための余分なテーブルを作成し、管理して)良いです。複数の追加情報が必要な場合は、外部キーを使用して独自のモデルを作成します。それは本当に状況に依存します。

アップデート: - 要求されたとして例:ドキュメントから

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

    def __unicode__(self): 
     return self.name 

class Group(models.Model): 
    name = models.CharField(max_length=128) 
    members = models.ManyToManyField(Person, through='Membership') 

    def __unicode__(self): 
     return self.name 

class Membership(models.Model): 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 
    date_joined = models.DateField() 
    invite_reason = models.CharField(max_length=64) 
あなたはメンバーシップの詳細( date_joinedinvite_reasonが)多対に加えて、保管されていることをこの例を見ることができます

多対多関係。

しかしドキュメントからの簡単な例に:

class Topping(models.Model): 
    ingredient = models.CharField(max_length=128) 

class Pizza(models.Model): 
    name = models.CharField(max_length=128) 
    toppings = models.ManyToManyField(Topping) 

余分なデータも必要となり、余分なモデルが存在しないようです。

アップデート2: -

関係を削除する方法の一例。

最初の例で私はこの特別なモデルを持っていましたMembershipあなたは通常のモデルのような関係とその詳細を削除するだけです。

for membership in Membership.objects.filter(person__pk=1) 
    membership.delete() 

Viola!やさしい。

あなたは(すべてを削除するか、 .clear().remove() を使用する必要がある第二の例の場合

apple = Toppings.objects.get(pk=4) 
super_pizza = Pizza.objects.get(pk=12) 

super_pizza.toppings.remove(apple) 
super_pizza.save() 

そして、その一つが、あまりにも行われます!

+0

例は役に立ちます:人々は映画で働きます。これは多対多である可能性があります。しかし、私はDjangoのManyToManyにORMがこの余分なメタデータを持つManyToMany関係を作成するのを手助けするための "スルー"演算子を持っています: "act"、 "director"、 "cinematographer" –

+0

@Elf私はちょうど怠惰で、ドキュメントの例で十分であると考えていました。私は今すぐ追加します;) –

+0

クラスの例は素晴らしいです - しかし、私の問題は多くのフィールドを追加して取得することです - それはドキュメントの欠落している例です。 – afshin

関連する問題