Jak uzyskać identyfikator właśnie utworzonego rekordu w Django?

83

Używam Django 1.3 do jednego z moich projektów i potrzebuję uzyskać identyfikator rekordu właśnie zapisanego w bazie danych.

Mam coś takiego jak poniższy kod, aby zapisać rekord w bazie danych:

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

Identyfikator rekordu właśnie zapisał automatyczne przyrosty. Czy istnieje sposób, aby uzyskać ten identyfikator i użyć go w innym miejscu w moim kodzie?

awatara
źródło
13
Linia n.save()jest tutaj niepotrzebna, ponieważ MyData.objects.createautomatycznie zapisuje nową instancję.
Daniel Roseman,
moja odpowiedź stackoverflow.com/a/25807622/3762142 zapewni Ci identyfikator na stronie html ..
Raja Simon

Odpowiedzi:

120

Użyj n.idpo zapisaniu.

Zobacz „ Automatyczna inkrementacja kluczy podstawowych ”.

JamesO
źródło
2
Kiedy zapisuję dane za pomocą formularza w widokach, to jak uzyskać dostęp do identyfikatora, który jest po prostu zapisywany przez obiekt froms?
Neeraj Kumar
2
Powinno być, n.pkponieważ będzie to identyfikator tylko wtedy, gdy sam nie dodałeś klucza podstawowego lub dodałeś go i nadałeś mu nazwę id.
Joel G Mathew
@JamesO jak pobrać lub rozwiązać ten identyfikator jako modelową instancję.
Jeet Patel
54

Byłoby n.pk.

Cytując „ Model.pk ”:

Niezależnie od tego, czy samodzielnie definiujesz pole klucza podstawowego, czy też pozwalasz Django je dostarczyć, każdy model będzie miał właściwość o nazwie pk. Zachowuje się jak normalny atrybut w modelu, ale w rzeczywistości jest aliasem dla dowolnego atrybutu, który jest kluczem podstawowym w modelu. Możesz odczytać i ustawić tę wartość, tak jak w przypadku każdego innego atrybutu, a spowoduje to zaktualizowanie prawidłowego pola w modelu.

Davor Lucic
źródło
4
niezłe znalezisko. Oznacza to, że wywołanie .pkjest prawdopodobnie uważane za „najlepszą praktykę”, ponieważ odwołuje się do domyślnego lub niestandardowego identyfikatora.
j_syk
powyższy link prowadzi do wersji django w programie deweloperskim. wersja 1.7-v1.10 mówi to samo, chociaż: docs.djangoproject.com/en/1.10/ref/models/instances/ ... nie jestem pewien przed wersją 1.7
Keith
7

Identyfikator zostanie automatycznie zaktualizowany w twoim modelu, więc natychmiast po n.save()linii możesz przeczytać n.idi zostanie on zapełniony.

Andrew Wilkinson
źródło
Próbowanie tego bez powodzenia: stackoverflow.com/questions/61160852/ ...
Daniel W.
1

Usuń save () i pobierz bezpośrednio pk:

n = MyData.objects.create(record_title=title, record_content=content)
n.pk
Jewhen Dyachenko
źródło
1

Miałem podobny problem z dostępem do identyfikatora. W Django 3.0.5 w ten sposób uzyskałem dostęp do id. Korzystając z przykładu i nazwy zmiennej, zobacz poniżej:

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

Zmienna „instancja” powyżej to lista. Dostęp do id w metodach opisanych powyżej zwraca AttributeError ("obiekt nie ma atrybutu 'id'") w Django 3.

Ta odpowiedź ma zastosowanie podczas używania modelformset_factory. Dzieje się tak podczas tworzenia klasy Form z modelu Django zgodnie z opisem w dokumentacji Django

bucephalus
źródło
0

Jeśli ktoś czyta to pytanie, pozostałe odpowiedzi nadal masz problemy z dostępem do id po utworzeniu obiektu. Upewnij się, że nie definiujesz idw modelu jako liczby całkowitej. Jest za darmo w Django, więc nie możesz pisać id ani używaćAutofield

#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...

jeśli zdefiniujesz idjako Integer, TestModel.objects.create(lub with save()zwróci None.

Raúl Martín
źródło