Подтвердить что ты не робот

Обновить модель django через kwargs

Как я могу передать dict, который содержит поля для обновления модели Django? Это не для создания объекта, а для его обновления.

Пример:

obj = Object.objects.create(index=id, **fields)
4b9b3361

Ответ 1

Пока PK тот же, существующая строка будет перезаписана.

obj = Object(index=id, **fields)
obj.save()

Ответ 2

def update_object(obj, **kwargs):
    for k, v in kwargs.items():
        setattr(obj, k, v)
    obj.save()

Ответ 3

Вы можете получить запрос на один объект, а затем обновить это:

model = Model.objects.filter(pk=pk)
model.update(**kwargs)

Это не вызовет метод .save() для объекта. Я думаю, что он будет выполнять только один запрос к базе данных.

Обратите внимание, что если вы не фильтровали один объект (т.е. запрос получил несколько объектов: например, если вы не запрашивали PK), он обновил бы все из них. Если он фильтрует значение none, в базу данных ничего не будет записано.

Сказав это, я не знал о решении Игнасио. Мне это очень нравится.

Ответ 4

Если вы знаете, что хотите его создать:

Book.objects.create(**fields)

Предполагая, что вам нужно проверить существующий экземпляр, вы можете найти его с помощью get или create:

instance, created = Book.objects.get_or_create(slug=slug, defaults=fields)
if not created:
    for attr, value in fields.iteritems(): 
        setattr(instance, attr, value)
    instance.save()

Как уже упоминалось в другом ответе, вы также можете использовать функцию update в диспетчере запросов, но я считаю, что не будет отправлять какие-либо сигналы (что может не иметь значения для вас, если вы их не используете). Однако вы, вероятно, не должны использовать его для изменения одного объекта:

Book.objects.filter(id=id).update(**fields)

Ответ 5

Этот вопрос немного стар, но для того, чтобы обновить его с недавними разработками Django - с 1.7 существует метод update_or_create в запросах, который работает аналогично get_or_create.

В этом случае его можно использовать как:

obj, created = Object.objects.update_or_create(index=id, defaults=fields)