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

12 投票
4 回答
8675 浏览
提问于 2025-04-15 11:59

我正在写一个Django应用,这个应用有很多功能,包括通过网址向数据库插入或更新记录。

比如说,有一个内部应用发送了一个请求到 /import/?a=1&b=2&c=3。在处理这个请求的视图中,我想创建一个新对象,foo = Foo(),并把这个对象的属性设置为请求中传来的数据。

现在我做的步骤是这样的:

  1. 请求发送到 /import/?a=1&b=2&c=3
  2. 视图创建新对象:foo = Foo()
  3. 对象用数据更新。

到目前为止,我的代码是这样的:

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

显然,这样做既繁琐又容易出错。因为网址中的数据和对象的属性名称完全相同,所以它们之间的关系其实是简单的一对一映射。

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

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

或者类似的效果。

谢谢!

4 个回答

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/,那么访问 /import/?a=Test&b=1 就会插入一个新的 Foo 对象,a 的值是 "Test",b 的值是 "1"。

3

如果 request.GET 是一个字典,并且 class Foo 没有使用 __slots__,那么这个代码也应该能正常工作:

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

你可以使用setattr函数来动态地设置属性:

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

撰写回答