gpt4 book ai didi

Django AutoField 不返回新的主键

转载 作者:行者123 更新时间:2023-11-29 12:01:09 24 4
gpt4 key购买 nike

我们正在处理的 Django 项目和我们的 postgresql 数据库有一个小问题。

我们正在进行的项目是从 PHP 站点到 Django 站点的站点/数据库转换。所以我们使用 inspect db 从当前的 PHP 后端生成模型。

它给了我们这个,我们添加了 primary_key 和 unique equals True:

class Company(models.Model):
companyid = models.IntegerField(primary_key=True,unique=True)
...
...

当我们最终要保存一个新的公司条目时,这似乎没有用。它会返回一个非空约束错误,因此我们迁移到如下所示的 AutoField:

class Company(models.Model):
companyid = models.AutoField(primary_key=True)
...
...

这可以很好地保存 Company 条目,但问题是我们何时这样做

result = form.save()

我们做不到

result.pk or result.companyid

在数据库中获取新给定的主键(但我们可以看到它已经在数据库中被赋予了正确的 companyid。

我们对正在发生的事情一头雾水。任何想法或答案将不胜感激,谢谢!

最佳答案

我刚刚遇到了同样的事情,但是在对一个历史悠久的项目进行 django 升级时。好痛……

无论如何,问题似乎是由 django 的 postgresql 后端获取新创建对象的主键的方式引起的:它使用 pg_get_serial_sequence 来解析表主键的序列。在我的例子中,id 列不是用 serial 类型创建的,而是用 integer 创建的,这意味着我的序列不是正确连接到 table.column。

以下是基于create语句的表,您需要根据自己的情况调整表名、列名和序列名:

CREATE TABLE "mike_test" (
"id" integer NOT NULL PRIMARY KEY,
"somefield" varchar(30) NOT NULL UNIQUE
);

如果您使用的是 postgresql 8.3 或更高版本,解决方案非常简单:

ALTER SEQUENCE mike_test_id_seq OWNED BY mike_test.id;

不过,如果您使用的是 8.1,则情况会有些困惑。我用以下(最简单的)案例重新创建了我的专栏:

ALTER TABLE mike_test ADD COLUMN temp_id serial NOT NULL;
UPDATE mike_test SET temp_id = id;
ALTER TABLE mike_test DROP COLUMN id;
ALTER TABLE mike_test ADD COLUMN id serial NOT NULL PRIMARY KEY;
UPDATE mike_test SET id = temp_id;
ALTER TABLE mike_test DROP COLUMN temp_id;
SELECT setval('mike_test_id_seq', (SELECT MAX(id) FROM mike_test));

如果您的专栏涉及任何其他约束,您会从中获得更多乐趣。

关于Django AutoField 不返回新的主键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6779399/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com