Django - 没有交叉表的ManyToMany关系

时间:2016-07-19 11:35:58

标签: python django django-models

我有2个型号:城市和服务。每个城市记录可以包含许多服务,每个服务都可以链接到每个城市。

class City(models.Model):
    name = models.CharField(max_length=255, unique=True)

class Service(models.Model):
    name = models.CharField(max_length=255, unique=True)

class CityService(models.Model):
    city = models.ForeignKey(City)
    service = models.ManyToManyField(Service)

我使用 ManyToManyField 来启用Django admin中的多个选择。 但是Django又创建了一个用于存储m2m关系的表格。

是否可以配置Django模型以便达到以下表结构:

+----+---------------+------------+
| id | city_id       | service_id |
+----+---------------+------------+
|  1 |             1 |         1  |
|  2 |             1 |         2  |
|  3 |             2 |         3  |
+----+---------------+------------+

3 个答案:

答案 0 :(得分:1)

你误解了ManyToManyField用法。 您无需创建单独的模型即可使用此关系。要创建一个单独的模型以作为ManyToManyField关系工作,请参阅下面的内容。但这样做您将无法使用Django为此manytomany关系提供的功能。

class CityService(models.Model):
  # Also you can add additional fields
  city = models.ForeignKey(City)
  service = models.ForeignKey(Service)

  class Meta:
    unique_together = ('city', 'service') # Make sure you dont have duplicate record in the table if so then remove this relation.

但是如果你想使用Django提供的ManyToManyField关系,让他们创建一个单独的表。只需使用下面的代码.. @Jedi已经提出了同样的建议。

class City(models.Model):
  name = models.CharField(max_length=255, unique=True)

class Service(models.Model):
  name = models.CharField(max_length=255, unique=True)
  city = models.ManyToManyField(City)

答案 1 :(得分:0)

根本不需要CityService表。 ManyToManyField 已经意味着一个连接表;你正在创建一个第二个,根本没有任何目的。在城市和服务之间直接使用M2M。

答案 2 :(得分:0)

为什么不使用像这样的结构:

class Service(models.Model):
    name = models.CharField(max_length=255, unique=True)

class City(models.Model):
    name = models.CharField(max_length=255, unique=True)
    service = models.ManyToManyField(Service)