2017-01-18 387 views
1

我需要一個多對多的Django關係;是這樣的:管理Django中的多對多關係

  • 我有用戶模型
  • 我有位置模型

用戶可以添加多個位置。我需要避免位置中出現重複: 如果更多用戶添加相同位置(即紐約),我將在位置模型中使用單個位置「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表,查看該位置的任何實例是否保留給其他用戶。如果不是,請刪除該位置。

例如:比利和莎莉是用戶。比利添加了紐約,這是一個新的地點。您創建位置條目,然後創建UserLocation條目。現在莎莉加了紐約。紐約已經在那裏,所以你只需要爲她創建UserLocation。

後來,莎莉刪除了紐約。首先刪除UserLocation條目,然後檢查並看到Billy還有紐約條目,因此您只能離開該位置。現在比利刪除了紐約。在刪除他的UserLocation條目後,您看到紐約沒有更多的實例,因此您可以刪除該位置。

也許你會通過重寫UserLocation delete()方法來檢查和刪除位置嗎?