Python django ORM-防止直接设置模型字段
我有一节Django课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
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)
,该方法通过Djangochat.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
装饰器: