我正在编写一个执行各种功能的Django应用程序,包括通过URL插入或更新新记录到数据库中。
因此,某些内部应用程序会向/import/?a=1&b=2&c=3
发送请求。
在视图中,我想创建一个新对象foo = Foo()
,并将foo
的成员设置为request.GET字典中的数据。
以下是我现在正在做的事情:
/import/?a=1&b=2&c=3
foo = Foo()
这是我到目前为止所得到的:
foo.a = request['a']
foo.b = request['b']
foo.c = request['c']
显然这很乏味且容易出错。 URL中的数据与对象的成员具有完全相同的名称,因此它是一个简单的1对1映射。
理想情况下,我希望能够做到这样的事情:
foo = Foo()
foo.update(request.GET)
或者那种效果。
谢谢!
答案 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”。