我在我的一个项目中使用Django 1.3,我需要获取刚保存在数据库中的记录的ID。
我有类似下面的代码来保存数据库中的记录:
n = MyData.objects.create(record_title=title, record_content=content)
n.save()
记录的ID刚刚保存了自动增量。有没有办法获取该ID并在我的代码中的其他地方使用它?
答案 0 :(得分:91)
保存后使用n.id
。
答案 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
答案 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。