如何获取刚刚在 Django 中创建的记录的 ID?

我正在为我的一个项目使用 Django 1.3,我需要获得刚刚保存在数据库中的记录的 ID。

我有一些类似下面的代码来保存数据库中的记录:

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

记录的 ID 刚刚保存了自动增量。有没有办法获取那个 ID 并在我的代码中的其他地方使用它?

100976 次浏览

Use n.id after the save.

See "Auto-incrementing primary keys".

The ID will be automatically updated in your model, so immediately after your n.save() line you can read n.id and it will be populated.

It would be n.pk.

To quote "Model.pk":

Regardless of whether you define a primary key field yourself, or let Django supply one for you, each model will have a property called pk. It behaves like a normal attribute on the model, but is actually an alias for whichever attribute is the primary key field for the model. You can read and set this value, just as you would for any other attribute, and it will update the correct field in the model.

Remove save() and get pk directly:

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

I had a similar issue with accessing the id. In Django 3.0.5, this is how I accessed the id. Using your example and variable name, see below:

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

The variable 'instance' above is a list. Accessing id in the methods described above returns an AttributeError ("object has no attribute 'id'") in Django 3.

This answer applies when using modelformset_factory. This is true when creating a Form class from a Django model as described in the Django docs

If someone reading this question and after check the other answers still having problems accessing the id after the creation of the object. Be sure you don't define id as an Integer in your model. If you decide to declare it anyways, use Autofield but you don't need to, It is for free with models.Model

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

if you do define id as Integer, TestModel.objects.create( or with save() will return None.