Jak uruchomić instrukcje update
i select
na tym samym, queryset
zamiast wykonywać dwa zapytania: - jedno do wybrania obiektu - drugie do zaktualizowania obiektu
Odpowiednik w SQL wyglądałby tak:
update my_table set field_1 = 'some value' where pk_field = some_value
update
metody, to wszelkie sygnały dołączone do tego modelu lub inne „elementy kodu” nie będą działać na obiektach. Tylko wskazówka od kogoś, kto się spalił :)update
Metoda doskonale nadaje się do aktualizacji masowych, ale powinna wyruszył ostrzeżenie w twojej głowie, gdy używasz go, że trzeba sprawdzić wszystkie sygnały podłączone do tego obiektu, które mogą również muszą być ręcznie opalaneMyModel.objects.filter(pk=some_value).update(field1=self.data)
Obiekty bazy danych Django używają tej samej metody save () do tworzenia i zmiany obiektów.
Ref .: https://docs.djangoproject.com/en/1.9/ref/models/instances/
źródło
Ta odpowiedź porównuje powyższe dwa podejścia. Jeśli chcesz zaktualizować wiele obiektów w jednej linii, przejdź do:
# Approach 1 MyModel.objects.filter(field1='Computer').update(field2='cool')
W przeciwnym razie musiałbyś iterować zestaw zapytań i aktualizować poszczególne obiekty:
#Approach 2 objects = MyModel.objects.filter(field1='Computer') for obj in objects: obj.field2 = 'cool' obj.save()
Podejście 1 jest szybsze, ponieważ wykonuje tylko jedno zapytanie do bazy danych, w porównaniu z podejściem 2, które powoduje zapytania do bazy danych „n + 1”. (Dla n pozycji w zestawie zapytań)
Pierwsze podejście powoduje jedno zapytanie o bazę danych, tj. UPDATE, drugie - dwa: SELECT, a następnie UPDATE.
Kompromis polega na tym, że załóżmy, że masz jakiekolwiek wyzwalacze, takie jak aktualizacja
updated_on
lub inne powiązane pola, nie zostaną one wyzwolone przy bezpośredniej aktualizacji, tj. W podejściu 1.Podejście 1 jest używane w zestawie zapytań, więc możliwe jest aktualizowanie wielu obiektów jednocześnie, nie w przypadku podejścia 2.
źródło
tylko w przypadku
serializer
rzeczy można zaktualizować w bardzo prosty sposób!tylko w przypadku
form
rzeczy!źródło
Django form
pochodzi z Django Proper.Jeśli chcesz ustawić nową wartość na podstawie starej wartości pola, wykonaj coś takiego:
update my_table set field_1 = field_1 + 1 where pk_field = some_value
użyj wyrażeń zapytań :
Spowoduje to niepodzielne wykonanie aktualizacji, która używa jednego żądania aktualizacji do bazy danych bez uprzedniego odczytu.
źródło
Pierwsza metoda
2. metoda
Trzecia metoda
Używając
get_object_or_404
4. metoda
Jeśli potrzebujesz, jeśli
pk=some_value
istnieje,update
to inny mądrycreate
nowy za pomocąupdate_or_create
.źródło