Обновление объекта Django - PullRequest
       6

Обновление объекта Django

96 голосов
/ 26 апреля 2010

Как запустить оператор обновления и выбора для одного и того же набора запросов, а не выполнять два запроса: один для выбора объекта и один для обновления объекта?

Эквивалент в SQL будет выглядеть примерно так:

update my_table set field_1 = 'some value' where pk_field = some_value

Ответы [ 4 ]

186 голосов
/ 26 апреля 2010

Использовать набор запросов объект update метод :

MyModel.objects.filter(pk=some_value).update(field1='some value')
52 голосов
/ 20 июня 2016

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

obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()

Как Джанго знает, что ОБНОВИТЬ против ВСТАВКИ
Если для атрибута первичного ключа объекта установлено значение, которое оценивается как True (то есть значение кроме None или пустой строки), Django выполняет ОБНОВЛЕНИЕ. Если атрибут первичного ключа объекта не задан или если UPDATE не обновите что-нибудь, Django выполняет INSERT.

Ссылка: https://docs.djangoproject.com/en/1.9/ref/models/instances/

7 голосов
/ 28 ноября 2018

Этот ответ сравнивает два вышеупомянутых подхода. Если вы хотите обновить много объектов в одной строке, выберите:

# Approach 1
MyModel.objects.filter(field1='Computer').update(field2='cool')

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

#Approach 2    
objects = MyModel.objects.filter(field1='Computer')
for obj in objects:
    obj.field2 = 'cool'
    obj.save()
  1. Подход 1 быстрее, потому что он выполняет только один запрос к базе данных, по сравнению с подходом 2, который выполняет запросы к базе данных «n + 1». (Для n элементов в наборе запросов)

  2. При первом подходе выполняется один запрос в БД, т.е. ОБНОВЛЕНИЕ, во втором - два: ВЫБРАТЬ, а затем ОБНОВИТЬ.

  3. Компромисс заключается в том, что, если у вас есть какие-либо триггеры, такие как обновление updated_on или любые другие подобные поля, он не будет запущен при прямом обновлении, то есть при подходе 1.

  4. Подход 1 используется в наборе запросов, поэтому можно обновлять несколько объектов одновременно, но не в случае подхода 2.

1 голос
/ 12 февраля 2019

только в случае serializer вещей, вы можете обновить очень простым способом!

my_model_serializer = MyModelSerializer(
    instance=my_model, data=validated_data)
if my_model_serializer.is_valid():

    my_model_serializer.save()

только в случае form вещей!

instance = get_object_or_404(MyModel, id=id)
form = MyForm(request.POST or None, instance=instance)
if form.is_valid():
    form.save()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...