【问题标题】:`No Unique Constraint` error on Django ForiegnKey w/ unique PK带有唯一 PK 的 Django ForiegnKey 上的“没有唯一约束”错误
【发布时间】:2021-05-22 23:31:53
【问题描述】:

有几十个类似的帖子,但通常 OP 不依赖内置的、自动递增的和已经唯一的 PK 值,因此它们往往有相同的答案。没有人回答我的问题。

在我的 (Django/Postgres) 生产 Google Cloud 服务器上运行 python manage.py migrate 时,我不断收到此错误:

django.db.utils.ProgrammingError: 引用表“api_bookgroup”的给定键没有唯一约束匹配

我知道错误是说“嘿!我不知道要返回哪个记录,因为没有唯一标识符”但是有两件事让我摸不着头脑:

  1. Django Docs 非常清楚“默认情况下,Django 使用相关对象的主键” - 所以 PK 应该是所需的唯一约束。
  2. 同样的代码可以在其他 3 台开发机器/数据库上完美运行,包括我们的 Google Cloud 开发实例(尽管每个其他实例在数据库中都有不同的数据)

第 2 点让我想知道 Django/Postgres 是否有可能以某种方式允许两个具有相同 PK 的 bookGroup 记录而不会引发可怕的错误?如果是这样,我将如何找到这些记录,如果没有,还有什么可能导致此错误?

感谢您的帮助!

# api.models.py

class BookGroup(models.Model):
    name = models.CharField(max_length=255, default='')
    description = models.CharField(max_length=255, blank=True)
    code = models.CharField(max_length=255, unique=True)
    ...
    
class HistBookGroup(HistoricalRecord):
    master_id = models.ForeignKey(BookGroup, on_delete=models.CASCADE, null=True, related_name='historical_data')
    name = models.CharField(max_length=255, default='')
    ...
class HistBookGroup(HistoricalRecord):
    master_id = models.ForeignKey(BookGroup, on_delete=models.CASCADE, null=True, related_name='historical_data')
    updated_by_user_id = models.ForeignKey(UserProfile, on_delete=models.CASCADE, related_name='hist_bookgroups_updated')
    name = models.CharField(max_length=255, default='')

【问题讨论】:

    标签: python django postgresql django-models google-cloud-platform


    【解决方案1】:

    好吧,事实证明,尽管 Django 保留了一个 PK 列并为 bookgroups 表自动递增它,但不知何故,PK 列的默认 is_uniqueis_PrimaryKey 值被关闭了。不知道如何或何时,但使用 DataGrip 仔细检查表格有助于揭示这一点。现在这个错误完全有意义了。

    我会留下这篇文章来帮助任何其他在这个问题上苦苦挣扎的可怜人。

    【讨论】:

      猜你喜欢
      • 2020-06-22
      • 1970-01-01
      • 2018-11-24
      • 2019-10-26
      • 2019-09-25
      • 2015-09-12
      • 1970-01-01
      • 2018-03-10
      • 2016-08-03
      相关资源
      最近更新 更多