Обновление модели django через kwargs - PullRequest
18 голосов
/ 05 ноября 2010

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

пример:

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

Ответы [ 6 ]

26 голосов
/ 05 ноября 2010

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

obj = Object(index=id, **fields)
obj.save()
15 голосов
/ 05 ноября 2010
def update_object(obj, **kwargs):
    for k, v in kwargs.items():
        setattr(obj, k, v)
    obj.save()
9 голосов
/ 06 ноября 2010

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

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

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

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

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

5 голосов
/ 24 сентября 2011

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

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()

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

Book.objects.filter(id=id).update(**fields)
4 голосов
/ 17 августа 2015

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

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

obj, created = Object.objects.update_or_create(index=id, defaults=fields)
0 голосов
/ 01 ноября 2018

Вы можете просто обновить , используя методы после filter() запроса

obj = Object.objects.filter(index=id).update(**fields) # fields your object(dict) may be **kwargs

, если это метод .get (),

obj = Object.objects.get(index=id)
obj['key1'] = 'value1'
obj.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...