gpt4 book ai didi

django - 如何设置主键,然后转换为自动字段?

转载 作者:行者123 更新时间:2023-11-29 11:22:27 26 4
gpt4 key购买 nike

我有一个名为 Document 的模型,我想添加一个新表,DocumentCluster位于其上方,带有指向 Document 的外键.

class DocumentCluster(models.Model):
sub_document = models.ForeignKey(Document)
...lots of fields here...

当我使用South添加这个表时,我需要通过将主键和外键设置为相同的值来填充它。

例如,如果我目前有一个 Document带有 pk 的对象12、新DocumentCluster对象将有一个 pk 12 和一个外键到 Document 12 号。

虽然我们需要 DocumentCluster 看起来很奇怪pk值匹配外键值还有一个重要原因。我们使用 Document pk在我们的网址中,但更改后网址将加载 DocumentCluster , 不是 Document , 所以我们需要 pkDocumentClusterDocument 中的相同.

完成后,我想要 DocumentCluster 的 PK成为一个 AutoField,从迁移的最高值开始递增。

这能做到吗?

最佳答案

你不能有一个 FK from DocumentCluster.pk to Document 同时制作 DocumentCluster.pk serial柱子。这是一个矛盾。它必须是两个单独的列。我想你的意思是相反的:from Document to DocumentCluster.

这可以通过 SQL DDL 命令来完成:

BEGIN;

CREATE TABLE DocumentCluster (pk serial, lots text, of_fields int, ...);

INSERT INTO DocumentCluster (pk, lots, of_fields, ...)
SELECT pk, lots, of_fields, ... FROM Document
ORDER BY pk; -- optional

ALTER TABLE DocumentCluster ADD CONSTRAINT DocumentCluster_pkey
PRIMARY KEY (pk); -- could be integrated in CREATE TABLE

ALTER TABLE Document -- and not the other way round!
ADD CONSTRAINT pk_fk FOREIGN KEY (pk) REFERENCES DocumentCluster(pk);

SELECT setval(pg_get_serial_sequence('DocumentCluster', 'pk'), max(pk))
FROM DocumentCluster; -- update SEQUENCE to highest value

COMMIT;
  • 您的混淆层 (Django) 可能正在使用双引号名称,例如 "Document",在这种情况下您必须执行相同的操作...

  • About setval().

  • About pg_get_serial_sequence()

  • PK 可以在 CREATE TABLE 语句中声明,但在插入行后添加它更便宜 - 假设 pk唯一的不为空

更多解释和链接:

关于django - 如何设置主键,然后转换为自动字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29855338/

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