【发布时间】:2016-08-16 03:20:55
【问题描述】:
Djangos ORM 对自动创建的 ID 列使用整数数据类型,但我需要它们是 bigint(使用 postgres 后端)。有没有办法做到这一点?
【问题讨论】:
标签: django postgresql django-models
Djangos ORM 对自动创建的 ID 列使用整数数据类型,但我需要它们是 bigint(使用 postgres 后端)。有没有办法做到这一点?
【问题讨论】:
标签: django postgresql django-models
使用新添加的BigAutoField
一个 64 位整数,很像 AutoField,只是它是有保证的 适合从 1 到 9223372036854775807 的数字。
你需要像这样创建你的模型
class MyModel(models.Model):
id = models.BigIntegerField(primary_key=True)
name = models.CharField(max_length=100)
然后在 ./manage.py makemigrations 运行后,打开生成的迁移并将以下内容添加到操作列表中:
migrations.RunSQL("CREATE SEQUENCE myapp_seq"),
migrations.RunSQL("ALTER TABLE myapp_mymodel ALTER COLUMN id SET DEFAULT NEXTVAL('myapp_seq')");
更新
Daniel Roseman 在 cmets 中提出了一个有效点。在 postgreql 中,以下查询有效
INSERT INTO myapp_mymodel(name) values('some name');
但以下不是因为主键不为空
INSERT INTO myapp_mymodel(id, name) values(null,'some name');
不幸的是,它是 django 传递的第二种形式的查询。这仍然可以通过一些工作来解决。
def save(self, *args, **kwargs):
if not self.id :
cursor = connection.cursor();
cursor.execute("SELECT NEXTVAL('myapp_seq')")
id = cursor.fetchone()
self.id = id[0]
Model(MyModel,self).save(*args, **kwargs)
【讨论】: