如何更改django中的默认主键?

时间:2018-01-18 03:48:31

标签: django postgresql

我是学习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”更改为“username”。因此,在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'字段了。我怎么能这样做?

由于

1 个答案:

答案 0 :(得分:0)

通常,您应该避免进入psql DB并运行任何命令。通过django的界面,大多数你需要做的事情都应该是可能的。例如,您需要在此处更新数据库的架构。为此,您需要1)对models.py进行更改,然后2)运行迁移。

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

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更新实际数据库以反映这一点。这非常简单(docs here)。步骤是转到manage.py所在的命令行,并按顺序运行以下两个命令:

python manage.py makemigrations
python manage.py migrate