Django Model Manager objects.create wo ist die Dokumentation?

85

Ich habe immer gelesen, dass ich verwenden sollte

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

Aber ich habe gerade gesehen, dass eine Managerfunktion erstellt wurde, weil ich eine OpenSource-Django-App gesehen habe, die sie verwendet.

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

Wird also empfohlen, es zu verwenden? Oder ist es immer noch bevorzugt, die .save-Methode zu verwenden? Ich vermute, dass objects.create versucht, es zu erstellen, egal was passiert, während save ein vorhandenes Objekt speichern kann, wenn das pk angegeben wird.

Dies sind die Dokumente, die ich gefunden habe: https://docs.djangoproject.com/de/dev/topics/db/queries/#creating-objects

Sam Stoelinga
quelle
11
Warum wurde diese Frage abgelehnt? Ich bin gerade mit der gleichen Frage hier angekommen und fand das nützlich.
Ferguzz
4
Ich wusste es auch nicht, vielleicht dachten die Leute, es sei dumm und offensichtlich. Kümmere dich nicht so sehr darum: P Ich habe meine Antwort bekommen, ich bin glücklich. Ich habe auch ohne Ergebnis gesucht, also habe ich gefragt.
Sam Stoelinga

Antworten:

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

gleichwertig:

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

Das force_insert bedeutet, dass immer ein neues Objekt erstellt wird.
Normalerweise brauchen Sie sich darüber keine Sorgen zu machen. Wenn Ihr Modell jedoch einen von Ihnen festgelegten manuellen Primärschlüsselwert enthält und dieser Wert bereits in der Datenbank vorhanden ist, schlägt ein Aufruf von create () mit einem IntegrityError fehl, da Primärschlüssel eindeutig sein müssen. Seien Sie darauf vorbereitet, die Ausnahme zu behandeln, wenn Sie manuelle Primärschlüssel verwenden.

suhailvs
quelle
3

erstellen macht im Wesentlichen das gleiche. Unten ist der Quellcode zum Erstellen.

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

Es erstellt eine Instanz und speichert sie dann.

rajesh.kanakabandi
quelle
1

Grundsätzlich sind diese beiden Methoden gleichwertig . Die Verwendung von Model.objects.createkönnte bevorzugt werden, da es eher zum Stil von Django passt.

gakhov
quelle