Ответы:
Используйте метод объектаupdate
queryset :
MyModel.objects.filter(pk=some_value).update(field1='some value')
update
метод отлично подходит для массовых обновлений, но он должен вызвать предупреждение в вашей голове, когда вы его используете, что вам нужно просмотреть любые сигналы, прикрепленные к этому объекту, которые, возможно, также потребуется
MyModel.objects.filter(pk=some_value).update(field1=self.data)
Объекты базы данных Django используют один и тот же метод save () для создания и изменения объектов.
obj = Product.objects.get(pk=pk)
obj.name = "some_new_value"
obj.save()
Как Django знает, что нужно делать UPDATE или INSERT.
Если для атрибута первичного ключа объекта установлено значение True (то есть значение, отличное от None или пустой строки), Django выполняет UPDATE. Если атрибут первичного ключа объекта не установлен или если UPDATE ничего не обновляет, Django выполняет INSERT.
Ссылка: https://docs.djangoproject.com/en/1.9/ref/models/instances/
В этом ответе сравниваются два вышеуказанных подхода. Если вы хотите обновить несколько объектов в одной строке, выполните:
# 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 быстрее, потому что он выполняет только один запрос к базе данных, по сравнению с подходом 2, который делает запросы к базе данных n + 1. (Для n элементов в наборе запроса)
Первый подход делает один запрос к БД, т.е. ОБНОВЛЕНИЕ, второй - два: ВЫБРАТЬ, а затем ОБНОВИТЬ.
Компромисс заключается в том, что, предположим, у вас есть какие-либо триггеры, такие как обновление updated_on
или любые подобные связанные поля, они не будут запускаться при прямом обновлении, то есть подходе 1.
Подход 1 используется в наборе запросов, поэтому можно обновлять сразу несколько объектов, а не в случае подхода 2.
только в случае с 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()
Django form
от Django Proper.
update
метод, тогда никакие сигналы, прикрепленные к этой модели или другому «материалу кода», не будут работать с объектами. Просто указатель от того, кто обгорел :)