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?
django
django-views
awatara
źródło
źródło
n.save()
jest tutaj niepotrzebna, ponieważMyData.objects.create
automatycznie zapisuje nową instancję.Odpowiedzi:
Użyj
n.id
po zapisaniu.Zobacz „ Automatyczna inkrementacja kluczy podstawowych ”.
źródło
n.pk
ponieważ będzie to identyfikator tylko wtedy, gdy sam nie dodałeś klucza podstawowego lub dodałeś go i nadałeś mu nazwę id.Byłoby
n.pk
.Cytując „ Model.pk ”:
źródło
.pk
jest prawdopodobnie uważane za „najlepszą praktykę”, ponieważ odwołuje się do domyślnego lub niestandardowego identyfikatora.Identyfikator zostanie automatycznie zaktualizowany w twoim modelu, więc natychmiast po
n.save()
linii możesz przeczytaćn.id
i zostanie on zapełniony.źródło
Usuń save () i pobierz bezpośrednio pk:
n = MyData.objects.create(record_title=title, record_content=content) n.pk
źródło
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źródło
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
id
w 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
id
jako Integer,TestModel.objects.create(
lub withsave()
zwróci None.źródło