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?

Benutzerbild
quelle
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 ".

JamesO
quelle
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.

Davor Lucic
quelle
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
7

Die ID wird in Ihrem Modell automatisch aktualisiert, sodass Sie sie unmittelbar nach Ihrer n.save()Zeile lesen können n.idund sie wird ausgefüllt.

Andrew Wilkinson
quelle
Versuchen Sie dies ohne Erfolg: stackoverflow.com/questions/61160852/…
Daniel W.
1

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

n = MyData.objects.create(record_title=title, record_content=content)
n.pk
Yevhen Dyachenko
quelle
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

Bucephalus
quelle
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.

Raúl Martín
quelle