代码之家  ›  专栏  ›  技术社区  ›  Nick Presta

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

  •  11
  • Nick Presta  · 技术社区  · 15 年前

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

    所以一些内部应用程序向 /import/?a=1&b=2&c=3 例如。 在视图中,我想创建一个新对象, foo = Foo() 并且有 foo 设置为request.get字典中的数据。

    我现在做的是:

    1. 请求发送到 进口/?A=1&B=2&C=3
    2. 视图创建新对象: Fo=英尺()
    3. 对象已用数据更新。

    到目前为止,我得到的是:

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

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

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

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

    或是有这种效果的东西。

    谢谢!

    4 回复  |  直到 15 年前
        1
  •  19
  •   Nick Presta    15 年前

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

    for key,value in request.GET.items():
        setattr(foo, key, value)
    
        2
  •  3
  •   tzot    15 年前

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

    # foo is a Foo instance
    foo.__dict__.update(request.GET)
    
        3
  •  1
  •   Daniel Roseman    15 年前

    你快到了。

    foo = Foo(**request.GET)
    

    应该有技巧。

        4
  •  1
  •   Matthew Christensen    15 年前

    如果您使用它来创建模型对象,然后将其持久化,我强烈建议使用 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 to/import/?a=test&b=1将插入一个新的foo,其中a=“test”和b=“1”。