多对多关系

2024-09-25 02:24:10 发布

您现在位置:Python中文网/ 问答频道 /正文

我的Postgres数据库中有两个表。一个包含来自世界不同地区的多个州,另一个包含这些州的邮政编码。你知道吗

它们是一个城市的多个邮政编码。但邮政编码只与一个城市相连。你知道吗

下面是我的两个表的示例:

国家:

+----+------------+-----------+-----------------------+
| pk |   state    | city      |         city_id       |
+----+------------+-----------+-----------------------+
|  1 | Montreal   | Quebec    |          123          |
+----+------------+-----------+-----------------------+
|  2 | Laval      | Quebec    |          123          |
+----+------------+-----------+-----------------------+
|  3 | Ottawa     | Ontario   |          837          |
+----+------------+-----------+-----------------------+

邮政编码:

+----+------------+-----------+-----------------------+
| pk |Postal Code | city      |         city_id       |
+----+------------+-----------+-----------------------+
|  1 | H1H1H1     | Quebec    |          123          |
+----+------------+-----------+-----------------------+
|  2 | H4P2T5     | Quebec    |          123          |
+----+------------+-----------+-----------------------+
|  3 | G1G2G2     | Ontario   |          837          |
+----+------------+-----------+-----------------------+

我正在使用django autocomplete光作为输入,现在我想转发我的州,用城市id字段过滤我的邮政编码。你知道吗

我的问题是Django的错误告诉我:

'stateModel.city_id' must set unique=True because it is referenced by a foreign key.

当我尝试使用外键时,外键不是唯一的,因为同一个城市可能在不同的州使用。当我试着用很多的时候我犯了这个错误

ERREUR:  la relation « postalCodeModel_city_id » n'existe pas
LINE 1: ...COUNT(*) AS "__count" FROM "postalCodeModel" INNER JOIN "postalCodeModel...

当我尝试创建一对多字段或在默认情况下发送pk时,如果我选择ManyToManyField选项。你知道吗

有没有办法从州模型中过滤城市的邮政编码?我是否需要创建一个City表,然后创建一个manytomanyfieldwithtrought选项到这个新表?

class stateModel(models.Model):
    idunique = models.IntegerField(unique=True, blank=True, null=True)
    state = models.TextField(blank=True, null=True)
    city = models.TextField(blank=True, null=True)
    city_id = models.TextField(blank=True, null=True)

    def __str__(self):
        return self.state

    class Meta:
        managed = False
        db_table = 'stateDB'


class codePostalModel(models.Model):
    cp_id = models.IntegerField(blank=True, null=True)
    cp = models.TextField(blank=True, null=True)
    #city_id_cp = models.TextField(blank=True, null=True)
    city_id_cp = models.ForeignKey(stateModel, to_field='city_id', blank=True, null=True, on_delete=models.CASCADE)
    #city_id_cp = models.ManyToManyField(stateModel)

    def __str__(self):
        return self.cp

    class Meta:
        managed = False
        db_table = 'postalCodeDB'

Tags: selfidtruecitymodelscpnullclass