Skip to main content
 首页 » 编程设计

python之Django之使用 kwargs 更新 Django 模型对象中的字段

2025年05月04日23youxin

我搜索了这个问题的简单答案,但找不到任何答案。
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等属性