Відповіді:
Використовуйте метод об'єктаupdate
набору запитів :
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 vs. INSERT
Якщо для атрибута основного ключа об'єкта встановлено значення, що визначається як True (тобто значення, відмінне від None, або порожній рядок), Django виконує UPDATE. Якщо атрибут первинного ключа об'єкта не встановлений або якщо UPDATE нічого не оновив, Django виконує ВСТУП.
Довідка: https://docs.djangoproject.com/en/1.9/ref/models/in вещества/
Ця відповідь порівнює два вищевказані підходи. Якщо ви хочете оновити багато об'єктів в одному рядку, перейдіть до:
# 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 елементів у наборі запитів)
Підхід кулаком робить один db-запит, тобто UPDATE, другий - два: SELECT, а потім UPDATE.
Компроміс полягає в тому, що, припустимо, у вас є будь-які тригери, такі як оновлення 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
метод, то будь-які сигнали, приєднані до цієї моделі чи інші "кодові речі", не будуть працювати проти об'єктів. Просто вказівник від того, хто отримав опік :)