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


82

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

我有类似下面的代码,可以将记录保存到数据库中:

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

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


13
该行在n.save()这里是不必要的,因为会MyData.objects.create自动保存新实例。
Daniel Roseman

我的答案stackoverflow.com/a/25807622/3762142将在html页面中获取
Raja Simon

Answers:


119

n.id保存后使用。

请参阅“自动递增主键”。


2
当我在视图中使用表单保存数据时,如何访问由froms对象保存的ID?
Neeraj Kumar

2
应该是n.pk因为只有当您自己没有添加主键或添加一个主键并将其命名为id时,它才会是id。
乔尔·马修

@JamesO如何获取或解析此id作为模型实例。
Jeet Patel

54

会的n.pk

引用“ Model.pk ”:

无论您是自己定义一个主键字段,还是让Django为您提供一个主键字段,每个模型都将具有一个称为pk的属性。它的行为类似于模型上的常规属性,但实际上是该模型的主键字段的别名。您可以像读取其他任何属性一样读取和设置此值,它将更新模型中的正确字段。


4
很高兴找到。这表明调用.pk可能被认为是“最佳实践”,因为它引用了默认ID或自定义ID。
j_syk 2011年

上面的链接指向django的in-dev版本。v 1.7-v1.10说了同样的话:docs.djangoproject.com/en/1.10/ref/models/instances/… 不确定v1.7之前
Keith


1

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

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

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文档中所述,从Django模型创建Form类时,这是正确的


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(使用withsave()将返回None。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.