【问题标题】:How do i change the default primary key in django?如何更改 django 中的默认主键?
【发布时间】:2018-01-18 03:48:31
【问题描述】:

我是学习 django 的新手。我使用 PostgreSQL 作为我的数据库。我创建了一个名为 gplus 的应用程序,我创建的模型看起来像这样

class Account(AbstractBaseUser):
  email = models.EmailField(max_length=50, unique=True)
  username = models.CharField(max_length=50, unique=True)
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  date_of_birth = models.DateTimeField()

我应用了迁移,然后想将主键字段从默认的“id”更改为“用户名”。因此,在 psql 命令行中,我运行了以下命令

ALTER TABLE gplus_account DROP CONSTRAINT gplus_account_pkey;
ALTER TABLE gplus_account ADD PRIMARY KEY (username);
ALTER TABLE gplus_account DROP COLUMN id;

然后在models.py中,我将用户名字段编辑为

username = models.CharField(max_length=50, primary_key=true)

现在,当我尝试应用迁移时,出现错误

django.db.utils.ProgrammingError: column "id" of relation "gplus_account" does not exist

似乎 Django 需要知道表中没有“id”字段了。我该怎么做?

谢谢

【问题讨论】:

  • 将用户名设为 PK 是个坏主意。 PK 应该与您的数据无关。
  • @DanielRoseman 你能详细说明为什么吗?我在网上搜索,发现为字段分配主键的唯一条件是字段中的每个数据都应该是唯一的。

标签: django postgresql


【解决方案1】:

一般来说,您应该避免进入您的 psql 数据库并运行任何命令。大多数情况下,您需要做的所有事情都应该通过 django 的接口来实现。例如,在这里您要更新数据库的模式。为此,您需要 1) 对 models.py 进行更改,然后 2) 运行迁移。

在这种情况下,您需要进行的更改是将用户名字段设置为主键,如here 所述,通过使用primary_key 的选项为true 来完成:

class Account(AbstractBaseUser):
  email = models.EmailField(max_length=50, unique=True)
  username = models.CharField(max_length=50, unique=True, primary_key=True)
  first_name = models.CharField(max_length=30)
  last_name = models.CharField(max_length=30)
  date_of_birth = models.DateTimeField()

现在您已经更新了模型的代码表示,您需要告诉 Django 更新实际的 DB 以反映这一点。这相当简单(文档here)。步骤是转到 manage.py 所在的命令行并按顺序运行以下两个命令:

python manage.py makemigrations
python manage.py migrate

【讨论】:

  • 好的,这告诉我如何更新架构,下次需要更新时我会使用它。但是我怎样才能修复我的病情呢?我是否需要从 psql 命令行再次添加 id 字段?或者更好的是,有没有办法让 Django 知道我不再使用 id 字段?
猜你喜欢
  • 1970-01-01
  • 2013-11-30
  • 2022-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多