环境:Django 1.8.11 + Postgis
我在MyModel上添加了一些ForeignKeys。 指出的模型是另一种模式(“制图”)。
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的作用。
答案 0 :(得分:1)
问题是属性名称(但我仍然不知道为什么):
zps_calculated = models.ForeignKey(Carto ...
我将其重命名为
zpsasd_calculated = models.ForeignKey(Carto
并将生成的约束名称更改为(sqlmigrate): a326518e5e22b0c2c1251e5bbb331adb
哇!
使用另一次迁移将zpsasd_calculated属性重命名为zps_calculated。
的工作。
下次我将使用自定义SQL进行迁移 https://www.ralphlepore.net/custom-foreign-key-constraints-with-django/