2016-10-16 11 views
1

私は、次のREQS合うことができる適切なDjangoのモデル作成しようとしています:アドレスクラスモデルは、多くの関係に多くのために働いていない

人と多くの関係に

人のクラスがある1クラスは、多くの

グループクラスを持つ多くの関係を予約クラスは、人の集まりやグループ

が含まれていたこれは私のコードです:

class Person(models.Model): 
    first_name = models.CharField(max_length=15) 
    last_name = models.CharField(max_length=20) 

    def __str__(self): 
     return self.first_name+ ' - ' + self.last_name 


class Address(models.Model): 
    person = models.ForeignKey(Person) 
    address_line = models.CharField(max_length=200) 

    def __str__(self): 
     return self.address_line 


class Group(models.Model): 
    group_name = models.CharField(max_length=12) 
    persons = models.ManyToManyField(Person) 

    def __str__(self): 
     return self.group_name 

class Book(models.Model): 
    record_name = models.CharField(max_length=12) 
    person = models.ForeignKey(Person) 
    group = models.ForeignKey(Group) 

    def __str__(self): 
     return self.record_name 

ただし、正しくありません。 1)グループに複数の人物が含まれるようになりましたが、人物にはグループが含まれていない可能性があります。 私はPersonクラスに次のコードを追加する必要がある場合はわからない:Bookクラスでのご予約はレコードあたりの人&グループの唯一の1レコードが含ま

groups = models.ManyToManyField(Group) 

2)。それはいくつかのparamsを求め、それをコンパイルしていないため

person = models.ForeignKey(Person, on_delete=models.CASCADE()) 

:私はモデルに外部キーを追加すると

3)は、私が on_deleteタグを削除しました。

私はC#のためにこれをすべて行う方法を知っていますが、私はPython/Djangoでこの単純な作業にちょっと固執しています。

+0

にバインドされている方法「Aグループは現在、複数の人を含めることができますが、人はどのグループが含まれていません。」。これは間違っています。外部キーはエンティティ間の双方向関係を構築するので、 'person.group_set.all()'は人が属するグループを与えます。また、デザインは一貫性の問題に脆弱です。これがあなたのデザインによって許可されるべきかどうかはわかりませんが、本はその本とは別のグループに所属する人が所有することができます。 – ozgur

答えて

1

1)ManyToManyフィールドは、モデルの1つにのみ表示され、Personモデルで必要と思われるものが表示されます。 ManyToManyフィールドに関するデータが異なるテーブルに保存されることを理解することが重要です。 Djangoは、buthモデル(このように基本的には、どこが便利かを選択する)を通じてこのフィールドを表示できるようにします。

2)あなたの構造を見て、ManyToManyフィールドを別のテーブルに使用することをお勧めします。ここでの例です:

class Activity(models.Model): 
    name = models.CharField(max_length=140) 
    description = models.TextField(blank=True, null=True) 

class Route(models.Model): 
    title = models.CharField(max_length=140) 
    description = models.TextField() 
    activities_meta = models.ManyToManyField(Activity, through = 'RouteOrdering') 

class RouteOrdering(models.Model): 
    route = models.ForeignKey(Route, on_delete=models.CASCADE) 
    activity = models.ForeignKey(Activity, on_delete=models.CASCADE, related_name='activita') 
    day = models.IntegerField() 
    order = models.IntegerField(default=0) 

データが多対多フィールド

関連する問題