2017-01-18 23 views
1

多対多のDjango関係が必要です。このような何か:Djangoの多対多関係の管理

  • 私が持っているUserモデルは
  • 私は
  • モデルの場所を持っている

ユーザーがより多くの場所を追加することができます。場所で重複を避ける必要があります: 多くのユーザーが同じ場所(ニューヨークなど)を追加すると、場所モデルに「NewYork」という単一の場所が表示されます。

ユーザーが場所を削除すると、他のユーザーがその場所にリンクされていない場合、場所表の対応する要素も削除されます。

このシナリオをどのように処理すればよいですか?

+0

[各ユーザーによる各書籍の単一定格の制限:Django ORM](http://stackoverflow.com/questions/41703940/restricting-single-rating-on-each-book-by-each-user)の可能な複製-django-orm) – e4c5

+0

あなたは何を試したのですか? – alphiii

答えて

0

それでは言わせて:

class Location(models.Model): 
    name = models.CharField(unique=True) 

class User(models.Model): 
    locations = models.ManyToManyField(Location, through='UserLocation') 
    name = models.CharField(unique=True) 

class UserLocation(models.Model): 
    user = models.ForeignKey(User) 
    location = models.ForeignKey(Location) 

あなたが明示的に中間テーブルを定義するが、のは、それを明確にするためにここにそれを使用できるようにする必要はありません。これは、単純な多対多の設定です。

ユーザーが場所を削除すると、対応するUserLocationエントリが削除されます。次に、その場所のインスタンスが他のユーザーのために残っているかどうかを確認するために、UserLocationテーブルを照会できます。そうでない場合は、場所を削除します。

例:BillyとSallyはユーザーです。ビリーは新しい場所であるニューヨークを追加します。 LocationエントリとUserLocationエントリを作成します。今、サリーはニューヨークを追加します。 New Yorkは既にそこにあるので、あなたのためにUserLocationを作成する必要があります。

その後、Sallyはニューヨークを削除します。最初にUserLocationエントリを削除してから、まだBillyのNew Yorkエントリがあるかどうかを確認してください。そのため、Locationだけを残します。 Now Billyはニューヨークを削除します。 UserLocationエントリを削除した後、ニューヨークのインスタンスがなくなり、その場所を削除することができます。

UserLocationのdelete()メソッドをオーバーライドして、場所の確認と削除を行うとしたらどうでしょうか?