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?
django
django-views
avatar
fuente
fuente
n.save()
es innecesaria aquí, ya queMyData.objects.create
guarda automáticamente la nueva instancia.Respuestas:
Usar
n.id
después de guardar.Consulte " Claves primarias de incremento automático ".
fuente
n.pk
ya que será id solo si no agregó una clave principal usted mismo, o agregó una y la nombró id.Lo sería
n.pk
.Para citar " Model.pk ":
fuente
.pk
probablemente se considera la "mejor práctica", ya que hace referencia a la identificación predeterminada o personalizada.La identificación se actualizará automáticamente en su modelo, por lo que inmediatamente después de su
n.save()
línea puede leern.id
y se completará.fuente
Elimine save () y obtenga pk directamente:
n = MyData.objects.create(record_title=title, record_content=content) n.pk
fuente
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.fuente
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
id
como 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
id
como Integer,TestModel.objects.create(
o consave()
devolverá None.fuente