首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Django addField ForeignKey在迁移过程中创建不可用的约束名称

Django addField ForeignKey在迁移过程中创建不可用的约束名称
EN

Stack Overflow用户
提问于 2016-03-09 16:53:11
回答 1查看 517关注 0票数 0

环境: Django 1.8.11 + Postgis

我在MyModel上添加了一些ForeignKeys。所指向的模型在另一个模式(“制图”)中。

代码语言:javascript
复制
makemigrations

无错误

代码语言:javascript
复制
migrate

一个错误。无法创建约束,因为生成的名称。但我添加了10个字段,它们之间非常相似。只有一个人会给出这个愚蠢的错误。我不能在任何地方指定约束名称。

代码语言:javascript
复制
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个字段出现错误

代码语言:javascript
复制
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...”

没有给出错误的模型:

代码语言:javascript
复制
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

这就是给出错误的模型:

代码语言:javascript
复制
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代码向后研究。

这个

代码语言:javascript
复制
 ' %s ADD CONSTRAINT %s FOREIGN KEY (%s) REFERENCES %s (%s)%s;' %

位于/django/db/backends/base/creation.py行180

使用它

代码语言:javascript
复制
qn = self.connection.ops.quote_name

这应该是%s约束名称的值:

代码语言:javascript
复制
qn(truncate_name(r_name, self.connection.ops.max_name_length()))

有没有人能给我个提示?我来看看qn是做什么的。

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

EN

回答 1

Stack Overflow用户

发布于 2016-03-09 20:43:55

问题出在属性名(但我仍然不知道为什么):

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/进行迁移。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35886914

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档