Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python django ORM-防止直接设置模型字段_Python_Django - Fatal编程技术网

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

Python django ORM-防止直接设置模型字段,python,django,Python,Django,我有一节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=Tr

我有一节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()
model方法更新节点

原因是我想记录对这些节点的所有更改(计算更改并用新的计数更新其他模型字段),但不要让我自己和其他开发人员忘记我们不能直接分配字段,因为这不会触发自定义
assign\u node
逻辑


我该怎么做

这只是禁用“主节点”的设置

class Chat(models.Model)
    def __setattr__(self, attrname, val):
        if attrname == 'primary_node': #sets only the attribute if it's not primary_node
            print('[!] You cannot assign primary_node like that! Use assign_node() method please.')
        else:
            super(Chat, self).__setattr__(attrname, val) 
编辑: 您可能应该使用
@属性
装饰器:

您可以尝试使用
\uuuu setattr\uuuuu
阻止分配到这些字段,但我建议您不要这样做,原因有两个:

  • 这可能会带来各种意想不到的副作用
  • 您正在运行时执行检查,以防止在编写代码时引入某些内容。这就像对每个请求运行一个(微小的)单元测试
  • 我只需将字段重命名为
    \u primary\u node
    \u secondary\u node
    ,以表明这些字段是私有字段,不打算直接使用


    此外,您可以为版本控制系统编写一个钩子,用于检查这些字段的分配。这可能是
    \u primary\u node=
    的一个简单grep,也可能是类似flake8这样的linter的插件。

    如何实现
    assign\u node()
    ?setter中的赋值是否也会触发
    \uuuuu setattr\uuuuu
    ?实际上我错了,您可能应该看看
    @property
    装饰器: