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?


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


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.


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


1

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

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

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


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.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.