如何使用dict更新对象的成员?

时间:2009-06-02 15:07:29

标签: python django

我正在编写一个执行各种功能的Django应用程序,包括通过URL插入或更新新记录到数据库中。

因此,某些内部应用程序会向/import/?a=1&b=2&c=3发送请求。 在视图中,我想创建一个新对象foo = Foo(),并将foo的成员设置为request.GET字典中的数据。

以下是我现在正在做的事情:

  1. 请求已发送至/import/?a=1&b=2&c=3
  2. 查看创建新对象:foo = Foo()
  3. 使用数据更新对象。
  4. 这是我到目前为止所得到的:

    foo.a = request['a']
    foo.b = request['b']
    foo.c = request['c']
    

    显然这很乏味且容易出错。 URL中的数据与对象的成员具有完全相同的名称,因此它是一个简单的1对1映射。

    理想情况下,我希望能够做到这样的事情:

    foo = Foo()
    foo.update(request.GET)
    

    或者那种效果。

    谢谢!

4 个答案:

答案 0 :(得分:19)

您可以使用setattr函数动态设置属性:

for key,value in request.GET.items():
    setattr(foo, key, value)

答案 1 :(得分:3)

如果request.GET是字典且class Foo不使用__slots__,那么这也应该有效:

# foo is a Foo instance
foo.__dict__.update(request.GET)

答案 2 :(得分:1)

你差不多了。

foo = Foo(**request.GET)

应该这样做。

答案 3 :(得分:1)

如果您使用它来创建一个然后被持久化的模型对象,我强烈建议您使用ModelForm。通过添加验证,这将以Django的规范方式执行您所描述的内容。

要扩展 - 我不是故意将它用于表单输出,只是表单输入。如下:

class Foo(models.Model):
      a = models.CharField(max_length=255),
      b = models.PositiveIntegerField()

class FooForm(forms.ModelForm):
      class Meta:
          model = Foo

def insert_foo(request):
      form = FooForm(request.GET)
      if not form.is_valid():
          # Handle error conditions here
          pass
      else:
          form.save()

      return HttpResponse('Your response')

然后,假设它绑定到/ import /,GET到/ import /?a = Test& b = 1将插入一个新的Foo,其中a =“Test”且b =“1”。