2017-06-06 6 views
0

私はDjangoを学んでいますが、models.ManyToManyFieldを理解できません。 AとBとCAとBはmodels.ManyToManyFieldの関係にあるはずのモデルです。私はそれがどのように動作するのか理解していないので、私はCと呼ばれる第3のモデルを作成しました。 B、それはデータを挿入しようとした多対多relashionship.I'veにAとBを置くテーブルだし、すべてが、私はそれが特別に助けテーブルCモデルだと思いokay.Hereは私のテストコード私はDjangoの2つのモデルの間のManyToMany関係をバイパスしようとしましたが、それが正しいかどうかわからない

class A(models.Model): 
    a_name=models.CharField(max_length=50) 

    def __str__(self): 
     return self.a_name 


class B(models.Model): 
    b_name=models.CharField(max_length=50) 

    def __str__(self): 
     return self.b_name 


#The table which links A and B with Many to Many relationship and receive A and B Foreign Keys 
class C(models.Model): 
    a=models.ForeignKey(A,on_delete=models.CASCADE) 
    b=models.ForeignKey(B,on_delete=models.CASCADE) 
    c_name=models.CharField(max_length=50) 

    def __str__(self): 
     return self.c_name 

ようですまた、属性を持っています。あなたはそのアイデアをどのように見つけますか?複雑なWebアプリケーションまたは私はその方法で作業を続けることができますか?この本質的にあなたがBに多くの分野に多くをマッピングしていることであると言う何をあなたがやっていることは効果的に3番目のモデルを使用して仲介を作成している

答えて

1

(通常はそれがthroughを使用して行われます)

class A(models.Model): 
    a_name=models.CharField(max_length=50) 
    b_name = models.ManyToManyField(to='B', through='C') 

    def __str__(self): 
     return self.a_name 

デフォルトでは、仲介モデルC.ジャンゴを通じて多対多フィールドマッピング中にこのようなものを作成します。

class a_b(models.Model): 
    a=models.ForeignKey(A,on_delete=models.CASCADE) 
    b=models.ForeignKey(B,on_delete=models.CASCADE) 

は、暗黙的にBに接続して作成しました。しかし、この接続にフィールドを追加したい場合は、throughを使用して仲介を作成します。

だから、暗黙のうちにそれを行うことの利点は、すなわち

class A(models.Model): 
    a_name=models.CharField(max_length=50) 
    b_name = models.ManyToManyField(B) 

    def __str__(self): 
     return self.a_name 

は、あなたの代わりにCのオブジェクトを作成するので.add().remove()のような機能を使用することができるということです。

より具体的な例では、私は人のモデル

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

、教室のモデルを持っていることを言う:

class ClassRoom(models.Model): 
    room_number = models.IntegerField() 
    people_in_room = models.ManyToManyField(Person) 

さて、これは私が教室にユーザーを追加し、そう

のように削除することができます
c.people_in_room.add(Person.objects.create(name='TestPerson') 

removeを使用して削除しますが、per息子は教室には不明です、つまりそれは学生ですか、それとも教師ですか?それでは、あなたができることを明示的に各教室に一人一人の関係を持つことができる今の仲介モデル

class ClassRoomRelationship(models.Model): 
    classroom = models.ForeignKeyField(ClassRoom) 
    person = models.ForeignKeyField(Person) 
    relationship = models.CharField(max_length=12) 

class ClassRoom(models.Model): 
    room_number = models.IntegerField() 
    people_in_room = models.ManyToManyField(Person, through='ClassRoomRelationship') 

を作成することです。

関連する問題