2009-06-02 67 views
11

我在写一个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. 对象与数据更新。

这里是我迄今:

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

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

理想情况下,我想做些力所能及的事是这样的:

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

或诸如此类的话。

谢谢!

+1

蚂蚁提供的解决方案,你想要做什么,但你是如何处理验证和类型转换?或者不关心(我觉得这很难相信)。 – 2009-06-02 15:13:38

+0

他们没有关系。这完全在内部使用,数据插入到一个数据库中(通过验证),然后(在此)插入到另一个数据库中。 – 2009-06-02 16:18:18

回答

19

可以使用SETATTR功能动态设置属性:

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

谢谢。我必须有一个大脑放屁,因为我查看了文档内置函数。 – 2009-06-02 15:13:20

+0

您可能希望将'a_dict`与`request`交换,'obj`交换'foo`以匹配Nick的代码。 – 2009-06-02 15:14:16

+0

我更新了它,如果蚂蚁很好。再次感谢! – 2009-06-02 15:24:05

1

你几乎得到了它。

foo = Foo(**request.GET) 

应该这样做。

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') 

然后,假设它势必/进口/,一个GET到/导入/ A =测试& B = 1将插入一个新的Foo被= “测试” 和b =“1? ”。

3

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

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