Как я могу обновить членов объекта, используя dict? - PullRequest
11 голосов
/ 02 июня 2009

Я пишу приложение 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)

или что-то в этом роде.

Спасибо!

Ответы [ 4 ]

19 голосов
/ 02 июня 2009

Вы можете использовать функцию setattr для динамической установки атрибутов:

for key,value in request.GET.items():
    setattr(foo, key, value)
3 голосов
/ 05 июня 2009

Если request.GET является словарем и class Foo не использует __slots__, то это также должно работать:

# foo is a Foo instance
foo.__dict__.update(request.GET)
1 голос
/ 02 июня 2009

Если вы используете это для создания объекта модели, который затем сохраняется, я настоятельно рекомендую использовать 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".

1 голос
/ 02 июня 2009

Вы почти получили это.

foo = Foo(**request.GET)

должен сделать трюк.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...