gpt4 book ai didi

python - django ORM - 防止直接设置模型字段

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:04 24 4
gpt4 key购买 nike

我有一个 Django 类

class Chat(models.Model):
primary_node = models.ForeignKey('nodes.Node', blank=True, null=True, related_name='chats_at_this_pri_node', on_delete=models.SET_NULL)
secondary_node = models.ForeignKey('nodes.Node', blank=True, null=True, related_name='chats_at_this_sec_node', on_delete=models.SET_NULL)

我想禁止直接分配字段,例如

chat.primary_node = some_node

而是创建一个方法chat.assign_node(primary, secondary),通过 Django Chat.update() 模型方法更新节点。

原因是我想记录对这些节点的所有更改(对更改进行计数并使用新计数更新其他模型字段),但不希望我自己和其他开发人员忘记我们无法直接分配字段,因为这会' t 触发自定义 assign_node 逻辑。

我怎样才能做到这一点?

最佳答案

您可以尝试使用 __setattr__ 阻止对这些字段进行赋值,但我建议您不要这样做,原因有两个:

  1. 这可能会带来各种意想不到的副作用
  2. 您正在运行时执行检查,以防止在编写代码时引入某些内容。这就像对每个请求运行一个(微小的)单元测试。

我只需将这些字段重命名为 _primary_node_secondary_node 以表明这些是私有(private)字段,不打算直接使用。

此外,您可以为版本控制系统编写一个钩子(Hook)来检查对这些字段的分配。这可能是 _primary_node = 的简单 grep 或更奇特的东西,例如 flake8 等 linter 的插件。

关于python - django ORM - 防止直接设置模型字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39452165/

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