如何更新django模型实例的多个字段?

Pur*_*ell 59 django django-models

我想知道,在django中更新模型实例的多个字段的标准方法是什么?......如果我有一些带有某些领域的模型,

Class foomodel(models.Model):
    field1 = models.CharField(max_length=10)
    field2 = models.CharField(max_length=10)
    field3 = models.CharField(max_length=10)
    ...
Run Code Online (Sandbox Code Playgroud)

...我用一个字段给出实例化,然后在一个单独的步骤中我想提供其余的字段,我如何通过传递字典或键值参数来做到这一点?可能?

换句话说,假设我有一个包含一些数据的字典,其中包含我要写入该模型实例的所有内容.模型实例已经在一个单独的步骤中实例化,让我们说它还没有被持久化.我可以说foo_instance.field1 = my_data_dict['field1']每个字段,但有些东西告诉我应该有一种方法在模型实例上调用一个方法,我只是立即传递所有的字段值对并更新它们.有点像foo_instance.update(my_data_dict).我没有看到任何这样的内置方法,我是否错过了它或者这是如何有效地完成的?

我有一种感觉,这是一个明显的,RTM类型的问题,但我只是没有在文档中看到它.

Wil*_*hes 123

这很容易混淆__dict__,但这不适用于从父类继承的属性.

您可以遍历dict以分配给对象:

for (key, value) in my_data_dict.items():
    setattr(obj, key, value)
Run Code Online (Sandbox Code Playgroud)

或者您可以直接从查询集修改它(确保您的查询集只返回您感兴趣的对象):

FooModel.objects.filter(whatever="anything").update(**my_data_dict)
Run Code Online (Sandbox Code Playgroud)

  • 请注意 `FooModel.objects.filter(whatever="anything").update(**my_data_dict)` 绕过了 save 方法。您最终可能会保存应该引发异常的内容。 (4认同)

Dan*_*man 29

你可以试试这个:

obj.__dict__.update(my_data_dict)
Run Code Online (Sandbox Code Playgroud)

  • 这不适用于继承的属性. (9认同)
  • @tomascharad - 你必须把它称为`obj .__ dict __.update(my_data_dict)`然后`obj.save()`来保存数据. (5认同)
  • 不适用于继承属性的事实有什么含义? (2认同)