¿Cómo obtener la ID de un registro recién creado en Django?

82

Estoy usando Django 1.3 para uno de mis proyectos y necesito obtener el ID de un registro que acabo de guardar en la base de datos.

Tengo algo como el siguiente código para guardar un registro en la base de datos:

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

El ID del registro que acaba de guardar incrementos automáticos. ¿Hay alguna forma de obtener esa identificación y usarla en otro lugar de mi código?

avatar
fuente
13
La línea n.save()es innecesaria aquí, ya que MyData.objects.createguarda automáticamente la nueva instancia.
Daniel Roseman
mi respuesta stackoverflow.com/a/25807622/3762142 obtendrá su identificación en la página html ..
Raja Simon

Respuestas:

119

Usar n.iddespués de guardar.

Consulte " Claves primarias de incremento automático ".

JamesO
fuente
2
Cuando guardo datos usando el formulario en las vistas, ¿cómo acceder a la identificación que solo se guarda con el objeto froms?
Neeraj Kumar
2
Debería ser así, n.pkya que será id solo si no agregó una clave principal usted mismo, o agregó una y la nombró id.
Joel G Mathew
@JamesO cómo obtener o resolver esta identificación como instancia de modelo.
Jeet Patel
54

Lo sería n.pk.

Para citar " Model.pk ":

Independientemente de si usted mismo define un campo de clave principal o deja que Django le proporcione uno, cada modelo tendrá una propiedad llamada pk. Se comporta como un atributo normal en el modelo, pero en realidad es un alias para cualquier atributo que sea el campo de clave principal del modelo. Puede leer y establecer este valor, como lo haría con cualquier otro atributo, y actualizará el campo correcto en el modelo.

Davor Lucic
fuente
4
buen hallazgo. Esto indica que la llamada .pkprobablemente se considera la "mejor práctica", ya que hace referencia a la identificación predeterminada o personalizada.
j_syk
el enlace de arriba va a la versión in-dev de django. v 1.7-v1.10 dice lo mismo, sin embargo: docs.djangoproject.com/en/1.10/ref/models/instances/ ... no estoy seguro antes de v1.7
Keith
7

La identificación se actualizará automáticamente en su modelo, por lo que inmediatamente después de su n.save()línea puede leer n.idy se completará.

Andrew Wilkinson
fuente
Intentando esto sin éxito: stackoverflow.com/questions/61160852/…
Daniel W.
1

Elimine save () y obtenga pk directamente:

n = MyData.objects.create(record_title=title, record_content=content)
n.pk
Yevhen Dyachenko
fuente
1

Tuve un problema similar al acceder a la identificación. En Django 3.0.5, así es como accedí al id. Usando su ejemplo y nombre de variable, vea a continuación:

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

La variable 'instancia' de arriba es una lista. Acceder a id en los métodos descritos anteriormente devuelve un AttributeError ("el objeto no tiene atributo 'id'") en Django 3.

Esta respuesta se aplica cuando se usa modelformset_factory. Esto es cierto cuando se crea una clase Form a partir de un modelo de Django como se describe en los documentos de Django.

Bucéfalo
fuente
0

Si alguien lee esta pregunta, el resto de las respuestas todavía tiene problemas para acceder a la identificación después de la creación del objeto. Asegúrese de no definir idcomo un número entero en su modelo. Es gratis en Django por lo que no puede escribir la identificación o usarAutofield

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

si lo define idcomo Integer, TestModel.objects.create(o con save()devolverá None.

Raúl Martín
fuente