Jaka jest różnica między uruchomieniem dwóch poleceń:
foo = FooModel()
i
bar = BarModel.objects.create()
Czy ten drugi od razu tworzy BarModel
w bazie danych metodę , podczas FooModel
gdy save()
metoda musi zostać jawnie wywołana, aby dodać ją do bazy danych?
Odpowiedzi:
https://docs.djangoproject.com/en/stable/topics/db/queries/#creating-objects
źródło
Dwie składnie nie są równoważne i może prowadzić do nieoczekiwanych błędów. Oto prosty przykład pokazujący różnice. Jeśli masz model:
I tworzysz pierwszy obiekt:
Następnie spróbuj utworzyć obiekt z tym samym kluczem podstawowym:
źródło
.create()
tworzy obiekt, nawet jeślinull=False
brakuje wymaganego pola ( )? Dodam testy do mojego projektu icreate
mam nieoczekiwane wynikiCharField
nawet jeśli ustawione nanull=False
nie spowoduje błędu, jeśli nie zostanie podany: dzieje się tak, ponieważ Django domyślnie ustawia ciągi na pusty,""
więc nie jest to technicznienull
obj = MyModel()
, więcobj.full_clean()
na razie.AKTUALIZACJA 15.3.2017:
Otworzyłem problem Django w tej sprawie i wydaje się, że jest wstępnie przyjęty tutaj: https://code.djangoproject.com/ticket/27825
Z mojego doświadczenia wynika, że podczas korzystania z klasy
Constructor
(ORM
) przez odwołania do Django1.10.5
mogą występować pewne niespójności w danych (tzn. Atrybuty tworzonego obiektu mogą uzyskać typ danych wejściowych zamiast rzutowanego typu właściwości obiektu ORM) :models
some_test.py
-object.create
some_test.py
-Constructor()
źródło