Ответ 1
Вы можете использовать функцию setattr для динамического набора атрибутов:
for key,value in request.GET.items():
setattr(foo, key, value)
Я пишу приложение 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)
или что-то в этом роде.
Спасибо!
Вы можете использовать функцию setattr для динамического набора атрибутов:
for key,value in request.GET.items():
setattr(foo, key, value)
Если request.GET
- словарь, а class Foo
не использует __slots__
, то это также должно работать:
# foo is a Foo instance
foo.__dict__.update(request.GET)
Вы почти получили его.
foo = Foo(**request.GET)
должен сделать трюк.
Если вы используете это для создания объекта модели, который затем сохраняется, я настоятельно рекомендую использовать 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".