如何获取刚刚保存的记录的ID

时间:2011-06-06 14:34:31

标签: django django-views

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

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

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

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

6 个答案:

答案 0 :(得分:91)

保存后使用n.id

请参阅“Auto-incrementing primary keys”。

答案 1 :(得分:43)

这将是n.pk

引用“Model.pk”:

  

无论您是否定义了   主键字段自己,或者让   Django为您提供一个,每个型号   将有一个名为pk的属性。它   表现得像一个普通的属性   model,但实际上是别名   无论哪个属性是主键   模型的字段。你可以阅读和   设置这个值,就像你想的那样   任何其他属性,它会   更新模型中的正确字段。

答案 2 :(得分:7)

ID会在您的模型中自动更新,因此,在n.save()行之后,您可以立即阅读n.id并填充该内容。

答案 3 :(得分:1)

我在访问ID时遇到类似的问题。在Django 3.0.5中,这就是我访问ID的方式。使用您的示例和变量名,请参见下文:

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

上面的变量“ instance”是一个列表。在上述方法中访问id会在Django 3中返回AttributeError(“对象没有属性'id'”)。

使用modelformset_factory时适用此答案。如Django docs

中所述,从Django模型创建Form类时,这是正确的。

答案 4 :(得分:0)

删除save()并直接获取pk:

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

答案 5 :(得分:0)

如果有人读了这个问题,其余的答案您在创建对象后仍无法访问id。 确保没有在模型中将id定义为Integer。它在Django中是免费的,因此您无法编写ID或使用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(或与save()一起将返回None。