gpt4 book ai didi

python - 处理 Django/Postgres 自然外键级联更新

转载 作者:行者123 更新时间:2023-11-29 13:48:18 25 4
gpt4 key购买 nike

在我的应用程序和数据库中,我有 CompoundName 模型。

# possible names of compound
class Name(models.Model):
compound_name = models.TextField(primary_key=True)

# compound
class Compound(models.Model):
# unique id for the compound
compound_id = models.AutoField(primary_key=True)
# name representing the compound
primary_name = models.ForeignKey(Name, db_column='compound_name', null=True, db_index=True, on_delete=models.PROTECT)

我希望发生的事情是,当我更改名称时,将“apsirin”说成“aspirin”,这种更改会影响到我的 Compound。

目前,由于 Django 处理这些 FK 关系的方式,这不起作用。如果我在 Django 中更新一个名称条目,它实际上只是创建一个新条目,而旧的化合物保留与该化合物的链接。

我想到了 3 种可能的解决方案,但我不太确定每种方案的所有缺点是什么。

  1. 为我的名字创建一个自定义的“更新”函数,首先获取/创建新的名字条目,找到所有引用旧名字的化合物/其他链接表,然后替换所有旧名字值与新名称值,最后删除旧名称之前。可能的缺点是,如果有人使用 django admin 更新名称,我不知道这将如何工作。

  2. 在尝试更新数据库之前使用信号拦截更新,并执行类似于 (1) 的操作

  3. 在 postgres 中创建触发器以在更新发生之前执行类似于 (1) 的操作。不过,我不太确定 Django 是否会对此抛出错误,因为它不知道触发器。

可能我只是忽略了 models.py 中模型的一些基本功能,如果是,那么希望这可以解决这个问题。但我没有看到 FK 的任何类型的 on_update 参数,而且我读到 Django 团队已将此标记为“无法修复”问题。

最佳答案

我还不明白,但是:

FK就是FK,我们只关心FK_id来链接它(1)

您可以更改模型的名称和 makemigrations (2)

# in SQL, i saw it create model_old, then create a new model and copy (for the function about add and remove field)
# in makemigrations, when change name: it just run the Update query.

当更改名称时,数据没有任何变化,它只是更新名称 (3)

当你改变一个FK的名字时(它仍然只是再次改变名字)(4)

从 (1) 开始,我们可以访问 FK 的数据 ~> 更改名称或类似的事情不会造成问题。

所以:

只要确保你创建了一个好的模型。

逻辑要从模型开始,切合自己的想法。

关于python - 处理 Django/Postgres 自然外键级联更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44814491/

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