我搜索了这个问题的简单答案,但找不到任何答案。
This question有点像,但不一样,所以就在这里。
假设我的 Django 模型中有一个自定义更新方法。
class People(models.Model):
identifier = models.CharField(max_length=255, primary_key = True)
name = models.CharField(max_length=255)
house = model.ForeignKey(House)
salary = model.IntegerField()
def my_fancy_update(self, **kwargs):
# Here I want to do my update
pass
我想做的是使用 kwargs 来更新我的模型。
现在我正在使用以下内容:
def my_fancy_update(self, **kwargs):
self.name = kwargs.get('name')
self.house = kwargs.get('house')
self.salary = kwargs.get('salary')
self.save()
这看起来像是我真正想做的事情:
def my_fancy_update(self, **kwargs):
self.update(**kwargs)
self.update 不起作用,因为它会引发错误:
AttributeError: 'People' 对象没有属性 'update'
self.objects.update 也不可能,因为使用 self 时无法访问管理器。
我现在的问题是,这是否可能以及如何在 Django 中完成。
它为我节省了很多时间来列出我实际模型中的每个属性。
请您参考如下方法:
我们可以迭代属性并更新值,然后我们调用 .save() 函数:
def my_fancy_update(self, **kwargs):
<b>for k, v in kwargs.items():
setattr(self, k, v)</b>
self.save()
然而,这将手动设置属性,因此可能会附加一些信号、触发器等来更新和清除值。
setattr(..) 是一个 Python 函数,使得 setattr(x, 'y', z) 等同于 x.y = z(请注意,我们在 setattr(..) 中将 'y' 作为字符串传递。
也无法更新related_field__attribute等属性
