如何使用字典更新对象的成员?
我正在写一个Django应用,这个应用有很多功能,包括通过网址向数据库插入或更新记录。
比如说,有一个内部应用发送了一个请求到 /import/?a=1&b=2&c=3
。在处理这个请求的视图中,我想创建一个新对象,foo = Foo()
,并把这个对象的属性设置为请求中传来的数据。
现在我做的步骤是这样的:
- 请求发送到
/import/?a=1&b=2&c=3
- 视图创建新对象:
foo = Foo()
- 对象用数据更新。
到目前为止,我的代码是这样的:
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)