Как я могу передать dict, который содержит поля для обновления модели Django? Это не для создания объекта, а для его обновления.
Пример:
obj = Object.objects.create(index=id, **fields)
Как я могу передать dict, который содержит поля для обновления модели Django? Это не для создания объекта, а для его обновления.
Пример:
obj = Object.objects.create(index=id, **fields)
Пока PK тот же, существующая строка будет перезаписана.
obj = Object(index=id, **fields)
obj.save()
def update_object(obj, **kwargs):
for k, v in kwargs.items():
setattr(obj, k, v)
obj.save()
Вы можете получить запрос на один объект, а затем обновить это:
model = Model.objects.filter(pk=pk)
model.update(**kwargs)
Это не вызовет метод .save() для объекта. Я думаю, что он будет выполнять только один запрос к базе данных.
Обратите внимание, что если вы не фильтровали один объект (т.е. запрос получил несколько объектов: например, если вы не запрашивали PK), он обновил бы все из них. Если он фильтрует значение none, в базу данных ничего не будет записано.
Сказав это, я не знал о решении Игнасио. Мне это очень нравится.
Если вы знаете, что хотите его создать:
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)
Этот вопрос немного стар, но для того, чтобы обновить его с недавними разработками Django - с 1.7 существует метод update_or_create
в запросах, который работает аналогично get_or_create
.
В этом случае его можно использовать как:
obj, created = Object.objects.update_or_create(index=id, defaults=fields)