Django model manager objects.create gdzie jest dokumentacja?


85

Zawsze czytałem, że powinienem użyć

model = Model(a=5, b=6)
model.save()

Ale właśnie zobaczyłem, że jest utworzona funkcja menedżera, ponieważ widziałem używającą jej aplikację open source django.

model = Model.objects.create(a=5, b=6)
print model.pk
1

Więc czy sugeruje się jego użycie? Czy nadal preferowane jest użycie metody .save. Domyślam się, że objects.create spróbuje go utworzyć bez względu na wszystko, podczas gdy save może zapisać istniejący obiekt, jeśli określono pk.

Oto dokumenty, które znalazłem: https://docs.djangoproject.com/en/dev/topics/db/queries/#creating-objects


11
dlaczego to pytanie zostało odrzucone? Właśnie przybyłem tutaj z tym samym pytaniem i okazało się to przydatne.
Ferguzz,

4
Nie wiedziałem też, może ludzie myśleli, że to głupie i oczywiste. Nie przejmuj się tym zbytnio: P Mam swoją odpowiedź Jestem szczęśliwy. Szukałem też bez wyniku, więc zapytałem.
Sam Stoelinga

Odpowiedzi:



44
p = Person.objects.create(first_name="Bruce", last_name="Springsteen")

równoważny:

p = Person(first_name="Bruce", last_name="Springsteen") 
p.save(force_insert=True)

Force_insert oznacza, że ​​nowy obiekt będzie zawsze tworzony.
Zwykle nie musisz się tym martwić. Jeśli jednak model zawiera ustawioną ręcznie wartość klucza podstawowego i jeśli ta wartość już istnieje w bazie danych, wywołanie metody create () zakończy się niepowodzeniem z błędem IntegrityError, ponieważ klucze podstawowe muszą być unikalne. Przygotuj się na obsługę wyjątku, jeśli używasz ręcznych kluczy podstawowych.


3

create zasadniczo robi to samo. poniżej znajduje się kod źródłowy do tworzenia.

def create(self, **kwargs):
    """
    Creates a new object with the given kwargs, saving it to the database
    and returning the created object.
    """
    obj = self.model(**kwargs)
    self._for_write = True
    obj.save(force_insert=True, using=self.db)
    return obj

tworzy instancję, a następnie ją zapisuje.


1

Zasadniczo te dwie metody są równoważne . Użycie Model.objects.createmoże być preferowane, ponieważ bardziej pasuje do stylu Django.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.