【问题标题】:Django addField ForeignKey during migrations create unusable constraint name迁移期间的 Django addField ForeignKey 创建不可用的约束名称
【发布时间】: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是怎么做的。

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

【问题讨论】:

  • 你的 db_table 设置中发生了一些非常奇怪的事情,'"cartography"."zsc_sic_sir"'
  • 我明白了……那是schema+table db表地址。工作完美无瑕。这不是我要添加的 9 个外键的问题。这是10号的问题

标签: django postgresql constraints schema django-migrations


【解决方案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/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-24
    • 2018-06-26
    • 2018-08-05
    • 2020-08-21
    • 2016-12-16
    • 2012-04-07
    • 1970-01-01
    相关资源
    最近更新 更多