迁移期间Django addField ForeignKey会创建不可用的约束名称

时间:2016-03-09 08:53:11

标签: django postgresql constraints schema django-migrations

环境: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的作用。

https://github.com/django/django/releases/tag/1.8.11

1 个答案:

答案 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/