2016-09-06 132 views
2

我想弄清楚如何在Django應用程序中唯一標識ManyToMany關係。我有類似以下型號:在Django中唯一標識ManyToMany關係

class City(models.Model): 
    name = models.CharField(max_length=255) 
    countries = models.ManyToManyField('Country', blank=True) 

class Country(models.Model): 
    name = models.CharField(max_length=255) 
    geo = models.ForeignKey('Geo', db_index=True) 

class Geo(models.Model): 
    name = models.CharField(max_length=255) 

我使用ManyToManyField類型爲countries場,因爲我想避免城市名稱重複(即有可能是一個城市的名字,如「春」出現在多個位置) 。

在我的應用程序的另一個地方,我想能夠唯一地識別城市與國家之間的地理關係。也就是說,我需要知道,一個用戶的城市是「斯普林菲爾德」,例如居住在美國,而不是加拿大。因此,我需要知道我的城市所映射的ManyToManyField關係中的哪一個。我的用戶看起來像這樣:

class MyUser(models.Model): 
    # ... other fields ... 
    city = models.ForeignKey('City', db_index=True, blank=True, null=True) 

這個設置顯然不能正確捕捉城市和國家之間的關係。捕捉獨特關係的最佳方式是什麼?我會使用自定義through-tableAutoField作爲關鍵字,並將我的用戶更改爲指向該直通表?

回答

2

我認爲你的想法through表是正確的方法。然後,我會將unique_together('city', 'country')添加到Meta

我不認爲有必要爲AutoField

+0

是否'geo'真正需要的是在通過表?一個國家只能處於一個地理位置,因此是'ForeignKey'引用。我覺得我可以根據需要通過簡單的連接獲得地理位置... –

+0

啊,你說得對。我會改變我的答案。 –