90 votes

Comment obtenir l'ID d'un enregistrement qui vient d'être créé dans Django ?

J'utilise Django 1.3 pour un de mes projets et j'ai besoin d'obtenir l'ID d'un enregistrement qui vient d'être sauvegardé dans la base de données.

J'ai quelque chose comme le code ci-dessous pour sauvegarder un enregistrement dans la base de données :

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

L'ID de l'enregistrement qui vient d'être sauvegardé s'incrémente automatiquement. Existe-t-il un moyen d'obtenir cet ID et de l'utiliser ailleurs dans mon code ?

15 votes

La ligne n.save() n'est pas nécessaire ici, car MyData.objects.create enregistre automatiquement la nouvelle instance.

0 votes

Ma réponse stackoverflow.com/a/25807622/3762142 vous obtiendra l'identité en page html

130voto

JamesO Points 7085

Utilisez n.id après le sauvetage.

Voir " Clés primaires auto-incrémentées ".

2 votes

Lorsque je sauvegarde des données en utilisant un formulaire dans des vues, comment accéder à l'identifiant qui vient d'être sauvegardé par l'objet Froms ?

2 votes

Il devrait être n.pk puisque ce sera id seulement si vous n'avez pas ajouté de clé primaire vous-même, ou si vous en avez ajouté une et l'avez nommée id.

0 votes

@JamesO comment obtenir ou résoudre cet id en tant qu'instance de modèle.

56voto

Davor Lucic Points 11072

Ce serait n.pk .

Pour citer " Modèle.pk " :

Peu importe que vous définissiez un clé primaire vous-même, ou que vous laissiez Django en fournir un pour vous, chaque modèle aura une propriété appelée pk. Cette propriété se comporte comme un attribut normal sur le mais c'est en fait un alias pour l'attribut qui est la clé primaire du modèle. Vous pouvez lire et et définir cette valeur, comme vous le feriez pour tout autre attribut, et il sera mettre à jour le champ correct dans le modèle.

8voto

Andrew Wilkinson Points 4875

L'ID sera automatiquement mis à jour dans votre modèle, donc immédiatement après que votre n.save() vous pouvez lire n.id et elle sera remplie.

0 votes

J'ai essayé sans succès : stackoverflow.com/questions/61160852/

4voto

Raúl Martín Points 2551

Si quelqu'un lisant cette question et après avoir vérifié les autres réponses a toujours des problèmes pour accéder à l'id après la création de l'objet. Assurez-vous que vous ne définissez pas id comme un nombre entier dans votre modèle. Si vous décidez de le déclarer quand même, utilisez la fonction Autofield mais vous n'avez pas besoin de le faire, il est gratuit avec models.Model

#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 vous définissez id en tant que nombre entier, TestModel.objects.create( ou avec save() retournera None.

3voto

bucephalus Points 73

J'ai eu un problème similaire avec l'accès à l'identifiant. Dans Django 3.0.5, voici comment j'ai accédé à l'id. En utilisant votre exemple et votre nom de variable, voyez ci-dessous :

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

La variable 'instance' ci-dessus est une liste. L'accès à id dans les méthodes décrites ci-dessus renvoie une AttributeError ("object has no attribute 'id'") dans Django 3.

Cette réponse s'applique lorsque vous utilisez modelformset_factory . C'est le cas lors de la création d'une classe de formulaire à partir d'un modèle Django, comme décrit dans le document Documentation sur Django

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X