1
votes

Django modifie les lignes au lieu d'en ajouter une nouvelle

Y a-t-il une raison pour laquelle un code comme celui-ci modifierait la seule ligne d'une table au lieu d'en créer une nouvelle?

newStudent = Student(name=var.name,
                     mark=var.mark,
                     year=newyear)
newStudent.save()

Je travaille sur les dossiers des élèves. Cette vue est appelée lorsque je mets à jour les informations d'un élève. var.name est le nom de l'élève avant la modification et var.mark est sa marque avant la modification. newyear est l'année pour laquelle j'ajoute ces informations.

Cette vue est appelée chaque année (c'est-à-dire qu'un élève a un nouveau nom et une nouvelle marque chaque année). Après ces lignes, je procède à la modification des informations sur l'année en cours de l'étudiant.

Le problème:

Ce code modifie la seule ligne de la table Student dans la base de données au lieu d'en ajouter une nouvelle.


2 commentaires

Cela peut être dû au fait que vous fournissez le même enregistrement à Student ()


pourquoi voulez-vous dire par le même record? Je suis sûr à 100% que l ' année est en train de changer, car c'est ainsi que j'ai compris que la vue modifiait les enregistrements au lieu d'en ajouter de nouveaux


3 Réponses :


2
votes

Si vous souhaitez créer un objet, utilisez les méthodes du gestionnaire de modèles de django pour créer votre objet, c'est-à-dire:

Student.objects.create(name=var.name, mark=var.mark, year=newyear)

Cela garantira la création explicitement au lieu de récupérer des lignes avec des valeurs existantes.


1 commentaires

Tu as raison. Apparemment, j'ai eu un problème avec les clés primaires qui empêchait la vue de créer de nouveaux enregistrements. Je marquerai votre réponse correcte dans 6 minutes. (Vous pouvez accepter une réponse en 6 minutes)



1
votes

Si vous utilisez une clé primaire existante lorsque vous créez un objet, vous pouvez mettre à jour votre objet.

student =  Student(name=var.name,
                     mark=var.mark,
                     year=newyear) 
student.save() # this means create new object



student =  Student(pk=existed_pk,name=var.name,
                     mark=var.mark,
                     year=newyear) 
student.save() # this means update student record which has existed_pk pk


0 commentaires

0
votes

Vous pouvez utiliser la méthode update_or_create , une méthode pratique pour mettre à jour votre objet avec le nom donné, en en créant un nouveau si nécessaire. Les valeurs par défaut sont un dictionnaire de paires (champ, valeur) utilisé pour mettre à jour l'objet.

 obj, created = Student.objects.update_or_create(name=var.name, defaults={mark=var.mark, year=newyear})

Renvoie un tuple de (objet, créé), où object est l'objet créé ou mis à jour et créé est un booléen spécifiant si un nouvel objet a été créé.


0 commentaires