/ / Django ModelForm: Do czego służy save (commit = False)? - django, django-models, django-forms

Django ModelForm: Do czego służy save (commit = False)? - django, django-models, django-forms

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 1

Jest 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).