2013-01-01 11 views
59

Ich möchte ein Modellobjekt wie Person erstellen, wenn die ID einer Person nicht existiert oder ich dieses Objekt der Person erhalten werde.Django-Modell erstellen oder aktualisieren, falls vorhanden

class Person(models.Model): 
    identifier = models.CharField(max_length = 10) 
    name = models.CharField(max_length = 20) 
    objects = PersonManager() 

class PersonManager(models.Manager): 
    def create_person(self, identifier): 
     person = self.create(identifier = identifier) 
     return person 

Aber ich weiß nicht, wo das bestehende Objekt Person zu überprüfen und zu erhalten:

Der Code eine neue Person wie folgt zu erstellen.

Antwort

111

Wenn Sie suchen Fall verwenden "Update, wenn sonst schaffen existiert", finden Sie in @Zags excellent answer


Django hat bereits eine get_or_create, https://docs.djangoproject.com/en/1.9/ref/models/querysets/#get-or-create

Für Sie es sein könnte:

id = 'some identifier' 
person, created = Person.objects.get_or_create(identifier=id) 

if created: 
    # means you have created a new person 
else: 
    # person just refers to the existing one 
+0

Ich bin mit django 1,9, und es gibt mir: Attribute: ‚QuerySet‘ Objekt hat kein Attribut ‚update_or_create‘ –

+0

@OfekGila Das ist seltsam, sowohl die [Quellcode] (https://github.com/django /django/blob/master/django/db/models/query.py#L475) und die [Dokumentation] (https://docs.djangoproject.com/en/1.9/ref/models/querysets/#update-or- create) bestätige 'QuerySet' hat' update_or_create' – bakkal

3

Ich dachte, ich würde eine Antwort hinzufügen, da Ihr Fragetitel aussieht, als ob er fragt, wie man erstellt oder aktualisiert, anstatt wie im Fragetext beschrieben zu erhalten oder zu erstellen.

Wenn Sie wollte ein Objekt erstellen oder zu aktualisieren, die .save() -Methode hat bereits dieses Verhalten standardmäßig von the docs:

Django abstracts the need to use INSERT or UPDATE SQL statements. Specifically, when you call save(), Django follows this algorithm:

If the object’s primary key attribute is set to a value that evaluates to True (i.e., a value other than None or the empty string), Django executes an UPDATE. If the object’s primary key attribute is not set or if the UPDATE didn’t update anything, Django executes an INSERT.

Es ist erwähnenswert, dass, wenn sie sagen ‚, wenn die UPDATE didn 't update anything' beziehen sich im Wesentlichen auf den Fall, dass die ID, die Sie dem Objekt gegeben haben, noch nicht in der Datenbank existiert.

73

Es ist unklar, ob Ihre Frage nach der get_or_create Methode (verfügbar ab mindestens Django 1.3) oder der update_or_create Methode (neu in Django 1.7) fragt. Es hängt davon ab, wie Sie das Benutzerobjekt aktualisieren möchten.

Beispiel Verwendung ist wie folgt:

# In both cases, the call will get a person object with matching 
# identifier or create one if none exists; if a person is created, 
# it will be created with name equal to the value in `name`. 

# In this case, if the Person already exists, its existing name is preserved 
person, created = Person.objects.get_or_create(
     identifier=identifier, defaults={"name": name} 
) 

# In this case, if the Person already exists, its name is updated 
person, created = Person.objects.update_or_create(
     identifier=identifier, defaults={"name": name} 
) 
+5

+1 für 'update_or_create', weil für diesen Anwendungsfall es besser ist als' get_or_create', nur 'save()' auf dem Objekt erneut aufzurufen. – bakkal

0

Wenn eines des Eingangs beim Erstellen ein Primärschlüssel ist, wird dies ausreicht:

Person.objects.get_or_create(id=1) 

Es wird automatisch, wenn da zwei existieren aktualisieren Daten mit demselben Primärschlüssel sind nicht erlaubt.

Verwandte Themen