【问题标题】:Django.db.utils.ProgrammingError: constraint does not existDjango.db.utils.ProgrammingError:约束不存在
【发布时间】:2020-05-24 20:03:23
【问题描述】:

我正在尝试在我的项目中运行 Django 迁移,但有些东西无法正常工作,我无法弄清楚会发生什么。

AuditableModelMixin 实体由我项目中的几乎所有实体扩展,并提供了几个用于审计目的的字段。尽管如此,迁移运行良好。虽然,对于Contract 模型,迁移正在创建以下两个单独的文件:

0001_initial.py

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
    ]

    operations = [
        migrations.CreateModel(
            name='Contract',
            fields=[
                ('id', models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False, verbose_name='identifier')),
                ('created_at', models.DateTimeField(auto_now_add=True, verbose_name='created at')),
                ('updated_at', models.DateTimeField(auto_now=True, verbose_name='updated at')),
                ('name', models.CharField(max_length=100, unique=True, verbose_name='name')),
                ('description', models.CharField(blank=True, max_length=1024, null=True, verbose_name='description')),
                ('created_by', models.ForeignKey(blank=True, db_column='created_by', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='contract_created_by', to=settings.AUTH_USER_MODEL, verbose_name='created by')),
            ],
            options={
                'verbose_name': 'contract',
                'verbose_name_plural': 'contracts',
                'db_table': 'sacv"."contract',
            },
        ),
    ]

0002_auto_20200524_1912.py(顺序会变,没关系)

class Migration(migrations.Migration):

    initial = True

    dependencies = [
        migrations.swappable_dependency(settings.AUTH_USER_MODEL),
        ('contract', '0001_initial'),
        ('jurisdiction', '0001_initial'),
        ('state', '0001_initial'),
    ]

    operations = [
        migrations.AddField(
            model_name='contract',
            name='jurisdictions',
            field=models.ManyToManyField(related_name='contracts', through='jurisdiction.Jurisdiction', to='state.State'),
        ),
        migrations.AddField(
            model_name='contract',
            name='updated_by',
            field=models.ForeignKey(blank=True, db_column='updated_by', null=True, on_delete=django.db.models.deletion.PROTECT, related_name='contract_updated_by', to=settings.AUTH_USER_MODEL, verbose_name='updated by'),
        ),
    ]

我不知道为什么,它将updated_by 放入一个单独的文件中。在我将ManyToMany 关系添加到Contract 模型中后,它开始发生。使用这种新方法,当我运行 python manage.py migrate 时,我收到以下错误:

Traceback (most recent call last):
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/sacv/manage.py", line 21, in <module>
    main()
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/sacv/manage.py", line 17, in main
    execute_from_command_line(sys.argv)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
    utility.execute()
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/core/management/__init__.py", line 395, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/core/management/base.py", line 328, in run_from_argv
    self.execute(*args, **cmd_options)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/core/management/base.py", line 369, in execute
    output = self.handle(*args, **options)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/core/management/base.py", line 83, in wrapped
    res = handle_func(*args, **kwargs)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/core/management/commands/migrate.py", line 231, in handle
    post_migrate_state = executor.migrate(
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/migrations/executor.py", line 117, in migrate
    state = self._migrate_all_forwards(state, plan, full_plan, fake=fake, fake_initial=fake_initial)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/migrations/executor.py", line 147, in _migrate_all_forwards
    state = self.apply_migration(state, migration, fake=fake, fake_initial=fake_initial)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/migrations/executor.py", line 245, in apply_migration
    state = migration.apply(state, schema_editor)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/migrations/migration.py", line 124, in apply
    operation.database_forwards(self.app_label, schema_editor, old_state, project_state)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/migrations/operations/fields.py", line 110, in database_forwards
    schema_editor.add_field(
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 480, in add_field
    self.execute(sql, params)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/base/schema.py", line 142, in execute
    cursor.execute(sql, params)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 100, in execute
    return super().execute(sql, params)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 68, in execute
    return self._execute_with_wrappers(sql, params, many=False, executor=self._execute)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 77, in _execute_with_wrappers
    return executor(sql, params, many, context)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/utils.py", line 90, in __exit__
    raise dj_exc_value.with_traceback(traceback) from exc_value
  File "/home/rodrigo/Workspace/fgv/sacv-p/src/backend/venv/lib/python3.8/site-packages/django/db/backends/utils.py", line 86, in _execute
    return self.cursor.execute(sql, params)
django.db.utils.ProgrammingError: constraint "contract_updated_by_4a62e48c_fk_account_id" does not exist

Error when trying create and run Django migrations!

Failed! The script execution has finished with errors!

如果我更改迁移文件并将updated_by 放入第一个文件中,一切正常,但我不认为这是正确的方法。有人对这个问题有任何线索吗?

以下代码是与问题相关的类:

审计类

class AuditableModelMixin(models.Model):
    created_at = models.DateTimeField(
        _('created at'),
        auto_now_add=True,
        editable=False
    )
    created_by = models.ForeignKey(
        'account.Account',
        verbose_name=_('created by'),
        db_column='created_by',
        related_name='%(class)s_created_by',
        null=True,
        blank=True,
        on_delete=models.PROTECT,
    )
    updated_at = models.DateTimeField(
        _('updated at'),
        auto_now=True,
    )
    updated_by = models.ForeignKey(
        'account.Account',
        verbose_name=_('updated by'),
        db_column='updated_by',
        related_name='%(class)s_updated_by',
        null=True,
        blank=True,
        on_delete=models.PROTECT,
    )

    class Meta:
        abstract = True
        ordering = ['-created_at']

合同类

class Contract(
    UUIDModelMixin,
    AuditableModelMixin
):
    jurisdictions = models.ManyToManyField(
        State,
        related_name='contracts',
        through='jurisdiction.Jurisdiction',
        through_fields=('contract', 'state')
    )
    name = models.CharField(_('name'), max_length=100, unique=True)
    description = models.CharField(
        _('description'),
        max_length=1024,
        blank=True,
        null=True
    )

    class Meta:
        db_table = 'sacv\".\"contract'
        verbose_name = _('contract')
        verbose_name_plural = _('contracts')

    def __str__(self):
        return self.description

管辖类别

class JurisdictionManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(
            active=True, ended_at__isnull=True
        )


class Jurisdiction(
    UUIDModelMixin,
    EligibilityModelMixin,
    AuditableModelMixin
):
    contract = models.ForeignKey(
        Contract,
        verbose_name=_('contract'),
        on_delete=models.PROTECT
    )
    state = models.ForeignKey(
        State,
        verbose_name=_('state'),
        related_name="+",  # Disable the reverse relation for State
        on_delete=models.PROTECT
    )

    objects = JurisdictionManager()

    class Meta:
        db_table = 'sacv\".\"jurisdiction'
        verbose_name = 'jurisdiction'
        verbose_name_plural = 'jurisdictions'

    def __str__(self):
        return f"{self.contract.name}: {self.state}"

【问题讨论】:

    标签: python django foreign-keys migration


    【解决方案1】:

    由于在创建约束时未传播架构的问题而发生此问题。这已得到修复,现在它就像一个魅力。更多信息请查看bug#31735

    【讨论】:

      猜你喜欢
      • 2018-08-05
      • 2019-02-18
      • 2018-07-08
      • 2021-03-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-11
      • 2016-03-09
      • 2014-10-25
      相关资源
      最近更新 更多