2016-09-06 58 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

啊,你说得对。我会改变我的答案。 –