首页 > 解决方案 > 迁移到 heroku postgres db 时出错:为列“id”指定了多个默认值

问题描述

我目前正在将我的 django 应用程序部署到 Heroku,并且在将我的数据库表迁移到 Postgresql 数据库时不断收到错误消息。

我收到以下错误:django.db.utils.ProgrammingError:为表“planning_location”的列“id”指定了多个默认值

我已经尝试了这篇文章中指定的解决方案:django.db.utils.ProgrammingError: multiple default values specified for column "_id" of table "Asset_movie"。然而,不幸的是,这并没有解决它..

这是planning_location 模型的结构:

class Location(models.Model):
    name = models.CharField(primary_key=True,max_length=200, unique=True)
    locationid = models.UUIDField(default=uuid.uuid4, editable=False)
    slug = models.SlugField(max_length=200, editable=False)
    description = models.TextField(blank=True, null=True)
    created_date = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs): # create slug from name when saving for the first time
        if not self.slug:
            self.slug = slugify(self.name)
        super(Location, self).save(*args, **kwargs)

名称是主键,这对于应用程序的另一部分至关重要。因为我没有另一个 id 字段,所以我创建了一个 UUID 字段,它作为第二个 id,而不是主键。

有谁知道为什么这不起作用,以及可以改变什么以使其成功?

标签: pythondjangopostgresqlheroku

解决方案


我想出了如何解决这个问题(在 reddit 用户的帮助下)。事实证明,您不应该将 primary_key=True 与 unique=True 结合使用。

所以我应该把我的模型改成这样:

class Location(models.Model):
    name = models.CharField(primary_key=True,max_length=200)
    locationid = models.UUIDField(default=uuid.uuid4, editable=False)
    slug = models.SlugField(max_length=200, editable=False)
    description = models.TextField(blank=True, null=True)
    created_date = models.DateTimeField(auto_now_add=True)

    def save(self, *args, **kwargs): # create slug from name when saving for the first time
        if not self.slug:
            self.slug = slugify(self.name)
        super(Location, self).save(*args, **kwargs)

推荐阅读