So erhalten Sie die ID des gerade gespeicherten Datensatzes


80

Ich verwende Django 1.3 für eines meiner Projekte und muss die ID eines Datensatzes abrufen, der gerade in der Datenbank gespeichert wurde.

Ich habe so etwas wie den folgenden Code, um einen Datensatz in der Datenbank zu speichern:

n = MyData.objects.create(record_title=title, record_content=content)
n.save()

Die ID des Datensatzes hat gerade automatische Inkremente gespeichert. Gibt es eine Möglichkeit, diese ID abzurufen und an einer anderen Stelle in meinem Code zu verwenden?


13
Die Zeile n.save()ist hier nicht erforderlich, da MyData.objects.createdie neue Instanz automatisch gespeichert wird.
Daniel Roseman

Meine Antwort stackoverflow.com/a/25807622/3762142 wird Sie ID in HTML-Seite bekommen ..
Raja Simon

Antworten:


115

Verwenden Sie n.idnach dem Speichern.

Siehe " Automatische Inkrementierung von Primärschlüsseln ".


2
Wenn ich Daten mithilfe eines Formulars in Ansichten speichere, wie kann ich dann auf eine ID zugreifen, die nur von einem Objekt gespeichert wird?
Neeraj Kumar

2
Dies sollte nur der Fall n.pksein, wenn Sie selbst keinen Primärschlüssel hinzugefügt oder einen hinzugefügt und als ID bezeichnet haben.
Joel G Mathew

@JamesO wie man diese ID als Modellinstanz erhält oder auflöst.
Jeet Patel

54

Es wäre n.pk.

Um " Model.pk " zu zitieren :

Unabhängig davon, ob Sie selbst ein Primärschlüsselfeld definieren oder Django eines für Sie bereitstellen lässt, hat jedes Modell eine Eigenschaft namens pk. Es verhält sich wie ein normales Attribut im Modell, ist jedoch ein Alias ​​für das Attribut, das das Primärschlüsselfeld für das Modell ist. Sie können diesen Wert wie bei jedem anderen Attribut lesen und festlegen und das richtige Feld im Modell aktualisieren.


4
schöner Fund. Dies weist darauf hin, dass das Aufrufen .pkwahrscheinlich als "Best Practice" angesehen wird, da es entweder auf die Standard-ID oder eine benutzerdefinierte ID verweist.
j_syk

Der obige Link führt zur In-Dev-Version von Django. v 1.7-v1.10 sagt jedoch dasselbe: docs.djangoproject.com/de/1.10/ref/models/instances/… nicht sicher vor v1.7
Keith


1

Entfernen Sie save () und holen Sie sich pk direkt:

n = MyData.objects.create(record_title=title, record_content=content)
n.pk

1

Ich hatte ein ähnliches Problem mit dem Zugriff auf die ID. In Django 3.0.5 habe ich auf diese Weise auf die ID zugegriffen. Anhand Ihres Beispiels und Variablennamens siehe unten:

instance = n.save()
# return the id
instance[0].id 

Die obige Variable 'Instanz' ist eine Liste. Der Zugriff auf id in den oben beschriebenen Methoden gibt einen AttributeError ("Objekt hat kein Attribut 'id'") in Django 3 zurück.

Diese Antwort gilt bei Verwendung modelformset_factory. Dies gilt, wenn Sie eine Formularklasse aus einem Django-Modell erstellen, wie in den Django-Dokumenten beschrieben


0

Wenn jemand diese Frage liest, haben Sie nach der Erstellung des Objekts immer noch Probleme, auf die ID zuzugreifen. Stellen Sie sicher, dass Sie idin Ihrem Modell keine Ganzzahl definieren . Es ist kostenlos in Django, so dass Sie die ID nicht schreiben oder verwenden könnenAutofield

#No
class TestModel(models.Model):
    id = models.IntegerField(primary_key=True)
    something...


#Ok
class TestModel(models.Model):
    id = models.AutoField(primary_key=True)
    something...

#Ok
class TestModel(models.Model):
    something...

Wenn Sie idals Ganzzahl definieren TestModel.objects.create(oder mit, save()wird None zurückgegeben.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.