【问题标题】:Getting bigint id fields when using Django and Postgres?使用 Django 和 Postgres 时获取 bigint id 字段?
【发布时间】:2016-08-16 03:20:55
【问题描述】:

Djangos ORM 对自动创建的 ID 列使用整数数据类型,但我需要它们是 bigint(使用 postgres 后端)。有没有办法做到这一点?

【问题讨论】:

    标签: django postgresql django-models


    【解决方案1】:

    Django 1.10

    使用新添加的BigAutoField

    一个 64 位整数,很像 AutoField,只是它是有保证的 适合从 1 到 9223372036854775807 的数字。

    旧版本的 django

    你需要像这样创建你的模型

    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)
    

    【讨论】:

    • 我认为旧版本的代码不能正常工作;如果没有明确标记为自动字段,Django 将不知道在保存时从数据库中获取新 id。
    猜你喜欢
    • 2019-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-05
    • 2012-10-07
    • 2013-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多