【发布时间】:2016-06-23 13:14:29
【问题描述】:
环境:Django 1.8.11 + Postgis
我在 MyModel 上添加了一些外键。 指向的模型位于另一个模式(“制图”)中。
makemigrations
没有错误
migrate
一个错误。无法创建约束,因为生成的名称。 但我添加了 10 个字段,它们之间非常相似。只有一个人给出了那个愚蠢的错误。 我无法在任何地方指定约束名称。
class myModel(models.Model)
zps_calculated = models.ForeignKey( Cartography_zps, verbose_name="zps_calcolato", null=True, blank=True, on_delete=models.SET_NULL)
zsc_sic_sir_calculated = models.ForeignKey( Cartography_zsc_sic_sir, verbose_name="zsc_sic_sir_calcolato", null=True, blank=True, on_delete=models.SET_NULL)
manyothersdata = "xxx"
这是从 sqlmigrate 生成的代码片段(用于检查迁移生成的代码)。 如您所见,约束的名称是错误。 10 个字段中的 1 个给出错误
CREATE INDEX "segnalazioni_f38ba181" ON "segnalazioni" ("zps_calculated_id");
ALTER TABLE "segnalazioni" ADD CONSTRAINT "se_zps_calculated_id_6844dce0603174b2_fk_"cartography"."zps"_id" FOREIGN KEY ("zps_calculated_id") REFERENCES "cartography"."zps" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX "segnalazioni_eb52e53f" ON "segnalazioni" ("zsc_sic_sir_calculated_id");
ALTER TABLE "segnalazioni" ADD CONSTRAINT "cc6ce48808e3a5292779a9787d21e5ad" FOREIGN KEY ("zsc_sic_sir_calculated_id") REFERENCES "cartography"."zsc_sic_sir" ("id") DEFERRABLE INITIALLY DEFERRED;
这是给出错误的名称:"se_zps_calculated_id_6844dce0603174b2_fk_"cartography"."zps"_id" 我认为应该是这样的: "6844dce0603174b2..."
模型没有给出错误:
class Cartography_zsc_sic_sir(models.Model):
id = models.AutoField(primary_key=True)
slug = models.CharField(max_length=40, blank=True, null=True)
nome = models.CharField(max_length=60, blank=True, null=True)
the_geom = models.MultiPolygonField(srid=23032, blank=True, null=True )
objects = models.GeoManager()
class Meta:
managed = False
db_table = '"cartography"."zsc_sic_sir"'
verbose_name = 'Cartography - zsc_sic_sir'
verbose_name_plural = 'Cartography - zsc_sic_sir'
ordering = ["id","slug"]
def __unicode__(self):
return self.nome
这是给出错误的模型:
class Cartography_zps(models.Model):
id = models.AutoField(primary_key=True)
slug = models.CharField(max_length=40, blank=True, null=True)
the_geom = models.MultiPolygonField(srid=23032, blank=True, null=True )
objects = models.GeoManager()
class Meta:
managed = False
db_table = '"cartography"."zps"'
verbose_name = 'Cartography - ZPS'
verbose_name_plural = 'Cartography - ZPS'
ordering = ["id","slug"]
def __unicode__(self):
return self.slug
我正在向后研究 Django 代码。
' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' %
在 /django/db/backends/base/creation.py 第 180 行
使用它
qn = self.connection.ops.quote_name
应该是 %s 约束名称值:
qn(truncate_name(r_name, self.connection.ops.max_name_length()))
谁有帮助我的提示? 我去看看qn是怎么做的。
【问题讨论】:
-
你的 db_table 设置中发生了一些非常奇怪的事情,
'"cartography"."zsc_sic_sir"' -
我明白了……那是schema+table db表地址。工作完美无瑕。这不是我要添加的 9 个外键的问题。这是10号的问题
标签: django postgresql constraints schema django-migrations