Как получить ID только что созданной записи в Django?

82

Я использую Django 1.3 для одного из своих проектов, и мне нужно получить идентификатор записи, только что сохраненной в базе данных.

У меня есть что-то вроде приведенного ниже кода для сохранения записи в базе данных:

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

ID записи только что сохраненных автоинкрементов. Есть ли способ получить этот идентификатор и использовать его где-нибудь еще в моем коде?

аватар
источник
13
Строка n.save()здесь не нужна, так как MyData.objects.createавтоматически сохраняется новый экземпляр.
Daniel Roseman
мой ответ stackoverflow.com/a/25807622/3762142 предоставит вам идентификатор на странице html ..
Раджа Саймон

Ответы:

119

Используйте n.idпосле сохранения.

См. « Автоинкремент первичных ключей ».

ДжеймсО
источник
2
Когда я сохраняю данные с помощью формы в представлениях, как получить доступ к идентификатору, который просто сохраняется с помощью объекта froms?
Нирадж Кумар
2
Так и должно быть, n.pkпоскольку он будет id только в том случае, если вы не добавляли первичный ключ самостоятельно или не добавляли его и назвали его id.
Джоэл Джи Мэтью
@JamesO, как получить или разрешить этот идентификатор в качестве экземпляра модели.
Джит Патель,
54

Было бы n.pk.

Процитируем " Model.pk ":

Независимо от того, определяете ли вы поле первичного ключа самостоятельно или позволяете Django предоставить его для вас, каждая модель будет иметь свойство с именем pk. Он ведет себя как обычный атрибут модели, но фактически является псевдонимом для любого атрибута, который является полем первичного ключа для модели. Вы можете прочитать и установить это значение, как и любой другой атрибут, и оно обновит правильное поле в модели.

Давор Лючич
источник
4
хорошая находка. Это указывает на то, что вызов .pk, вероятно, считается «лучшей практикой», поскольку он ссылается либо на идентификатор по умолчанию, либо на пользовательский идентификатор.
j_syk 06
приведенная выше ссылка ведет на версию django для разработчиков. v 1.7-v1.10 говорит то же самое: docs.djangoproject.com/en/1.10/ref/models/instances/… не уверен насчет до версии 1.7
Keith
7

Идентификатор будет автоматически обновлен в вашей модели, поэтому сразу после вашей n.save()строки вы сможете прочитать, n.idи она будет заполнена.

Эндрю Уилкинсон
источник
Безуспешная попытка: stackoverflow.com/questions/61160852/…
Дэниел В.
1

Удалите save () и получите pk напрямую:

n = MyData.objects.create(record_title=title, record_content=content)
n.pk
Евгений Дьяченко
источник
1

У меня была аналогичная проблема с доступом к идентификатору. В Django 3.0.5 я получил доступ к идентификатору именно так. Используя ваш пример и имя переменной, см. Ниже:

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

Вышеупомянутая переменная instance - это список. Доступ к идентификатору в описанных выше методах возвращает AttributeError («объект не имеет атрибута 'id'») в Django 3.

Этот ответ применим при использовании modelformset_factory. Это верно при создании класса формы из модели Django, как описано в документации Django.

Буцефал
источник
0

Если кто-то читает этот вопрос, остальные ответы у вас все еще есть проблемы с доступом к идентификатору после создания объекта. Убедитесь, что вы не определяете idв своей модели целое число. В Django это бесплатно, поэтому вы не можете писать идентификатор или использовать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...

если вы определите idкак Integer, TestModel.objects.create(или with save()вернет None.

Рауль Мартин
источник