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

Выбрать и обновить запись базы данных с помощью одного набора запросов

Как выполнить операторы update и select для одного и того же queryset, вместо того чтобы выполнять два запроса: - один для выбора объекта - и один, чтобы обновить объект

Эквивалентом в SQL будет что-то вроде:

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

Ответ 2

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

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

Как Django знает UPDATE против INSERT
Если для атрибута первичного ключа объектов установлено значение, которое имеет значение True (то есть значение кроме None или пустой строки), Django выполняет UPDATE. Если атрибут первичного ключа объектов не установлен или если UPDATE didnt обновить все, Django выполняет INSERT.

Ref.: https://docs.djangoproject.com/en/1.9/ref/models/instances/

Ответ 3

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

# 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.

Ответ 4

только в случае с вещами 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()