Я использую Django 1.3 для одного из своих проектов, и мне нужно получить идентификатор записи, только что сохраненной в базе данных.
У меня есть что-то вроде приведенного ниже кода для сохранения записи в базе данных:
n = MyData.objects.create(record_title=title, record_content=content)
n.save()
ID записи только что сохраненных автоинкрементов. Есть ли способ получить этот идентификатор и использовать его где-нибудь еще в моем коде?
django
django-views
аватар
источник
источник
n.save()
здесь не нужна, так какMyData.objects.create
автоматически сохраняется новый экземпляр.Ответы:
Используйте
n.id
после сохранения.См. « Автоинкремент первичных ключей ».
источник
n.pk
поскольку он будет id только в том случае, если вы не добавляли первичный ключ самостоятельно или не добавляли его и назвали его id.Было бы
n.pk
.Процитируем " Model.pk ":
источник
.pk
, вероятно, считается «лучшей практикой», поскольку он ссылается либо на идентификатор по умолчанию, либо на пользовательский идентификатор.Идентификатор будет автоматически обновлен в вашей модели, поэтому сразу после вашей
n.save()
строки вы сможете прочитать,n.id
и она будет заполнена.источник
Удалите save () и получите pk напрямую:
n = MyData.objects.create(record_title=title, record_content=content) n.pk
источник
У меня была аналогичная проблема с доступом к идентификатору. В Django 3.0.5 я получил доступ к идентификатору именно так. Используя ваш пример и имя переменной, см. Ниже:
instance = n.save() # return the id instance[0].id
Вышеупомянутая переменная instance - это список. Доступ к идентификатору в описанных выше методах возвращает AttributeError («объект не имеет атрибута 'id'») в Django 3.
Этот ответ применим при использовании
modelformset_factory
. Это верно при создании класса формы из модели Django, как описано в документации Django.источник
Если кто-то читает этот вопрос, остальные ответы у вас все еще есть проблемы с доступом к идентификатору после создания объекта. Убедитесь, что вы не определяете
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(
или withsave()
вернет None.источник