Dlaczego miałbym kiedykolwiek skorzystać? save(commit=False)
zamiast po prostu tworzyć obiekt formularza z ModelForm
podklasa i działa is_valid()
sprawdzić poprawność zarówno formy, jak i modelu?
Innymi słowy, czym jest save(commit=False)
dla?
Jeśli nie masz nic przeciwko, czy możesz podać hipotetyczne sytuacje, w których może to być przydatne?
Odpowiedzi:
66 dla odpowiedzi nr 1Jest to przydatne, gdy większość danych modelu otrzymasz z formularza, ale musisz je wypełnić null=False
pola z danymi nieformalnymi.
Zapisywanie z commit = False pobiera obiekt modelu, następnie możesz dodać swoje dodatkowe dane i zapisać je.
To dobry przykład tej sytuacji.
22 dla odpowiedzi nr 2
Oto odpowiedź (z dokumentów):
# Create a form instance with POST data.
>>> f = AuthorForm(request.POST)
# Create, but don"t save the new author instance.
>>> new_author = f.save(commit=False)
Najczęstszą sytuacją jest pobranie instancji z formularza, ale tylko "w pamięci", a nie w bazie danych. Przed zapisaniem chcesz wprowadzić pewne zmiany:
# Modify the author in some way.
>>> new_author.some_field = "some_value"
# Save the new instance.
>>> new_author.save()
5 dla odpowiedzi nr 3
Z dokumentacji Django:
Ta metoda save () akceptuje opcjonalne zatwierdzenieargument słów kluczowych, która akceptuje True lub False. Jeśli wywołasz save () z commit = False, następnie zwróci obiekt, który nie został jeszcze zapisany w bazie danych.
W takim przypadku od Ciebie zależy, czy wywołasz save ()wynikowa instancja modelu. Jest to przydatne, jeśli chcesz zrobić niestandardowe przetwarzanie na obiekcie przed jego zapisaniem, lub jeśli chcesz skorzystać z jednej z wyspecjalizowanych opcji oszczędzania modelu. commit jest domyślnie True.
Wygląda na to, że save (commit = False) tworzy instancję modelu, którą zwraca do ciebie. Co jest miłe dla niektórych procesów przetwarzania, zanim faktycznie go zapisujesz!
5 dla odpowiedzi № 4
Jako "prawdziwy przykład" rozważ model użytkownika, w którym adres e-mail i nazwa użytkownika są zawsze takie same, a następnie możesz zastąpić metodę zapisu ModelForm, taką jak:
class UserForm(forms.ModelForm):
...
def save(self):
# Sets username to email before saving
user = super(UserForm, self).save(commit=False)
user.username = user.email
user.save()
return user
Jeśli nie używałeś commit=False
aby ustawić nazwę użytkownika na adres e-mail, musisz zmodyfikować metodę zapisu modelu użytkownika lub dwukrotnie zapisać obiekt użytkownika (co powiela kosztowną operację bazy danych).