Як отримати ідентифікатор щойно створеного запису в Django?


82

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

У мене є щось на зразок коду нижче, щоб зберегти запис у базі даних:

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

Ідентифікатор запису щойно збережених автоматичних приростів. Чи є спосіб отримати цей ідентифікатор і використати його десь ще в моєму коді?


13
Рядок n.save()тут непотрібний, оскільки MyData.objects.createавтоматично зберігає новий екземпляр.
Даніель Роузман,

моя відповідь stackoverflow.com/a/25807622/3762142 дасть вам ідентифікатор на сторінці html ..
Раджа Саймон

Відповіді:


119

Використовуйте n.idпісля збереження.

Див. " Автоматичне збільшення первинних ключів ".


2
Коли я зберігаю дані за допомогою форми у поданнях, як тоді отримати доступ до ідентифікатора, який просто зберігається об’єктом froms?
Neeraj Kumar

2
Це повинно бути, n.pkоскільки це буде ідентифікатор лише в тому випадку, якщо ви не додали первинний ключ самостійно або додали його та назвали ідентифікатором.
Joel G Mathew

@JamesO як отримати або вирішити цей ідентифікатор як екземпляр моделі.
Jeet Patel,

54

Це було б n.pk .

Цитую « Model.pk »:

Незалежно від того, чи ви визначаєте поле первинного ключа самостійно, або дозволяєте Django надавати його вам, кожна модель матиме властивість, що називається pk. Він поводиться як звичайний атрибут моделі, але насправді є псевдонімом для того, який атрибут є первинним ключовим полем для моделі. Ви можете прочитати і встановити це значення, як і для будь-якого іншого атрибута, і воно оновить правильне поле в моделі.


4
приємна знахідка. Це вказує на те, що виклик .pk, мабуть, вважається "найкращою практикою", оскільки він посилається або на ідентифікатор за замовчуванням, або на власний ідентифікатор.
j_syk

посилання вище йде на версію django у розробнику. v 1.7-v1.10 каже те саме, однак: docs.djangoproject.com/en/1.10/ref/models/instance/ ... не впевнений у тому, що до v1.7
Кіт,



1

У мене була подібна проблема з доступом до ідентифікатора. У Django 3.0.5 саме так я отримав доступ до ідентифікатора. Використовуючи приклад та ім’я змінної, дивіться нижче:

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

Змінна 'екземпляр' вище - це список. Доступ до ідентифікатора в описаних вище методах повертає AttributeError ("об'єкт не має атрибута 'id'") у Django 3.

Ця відповідь застосовується під час використання modelformset_factory. Це вірно при створенні класу Form з моделі 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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.