1
votes

Enregistrer plusieurs valeurs de colonne à l'aide d'une boucle for dans Django

Dans ma base de données (SQLite), je voudrais mettre à jour chaque colonne d'une ligne donnée en utilisant une boucle for dans un dictionnaire. J'ai recherché la documentation SO et Django, mais je n'ai trouvé aucune information concernant la mise à jour de plusieurs colonnes via une boucle for. Je soupçonne qu'il existe une solution simple à mon problème, mais je suis à court de mots clés pour Google.

Voici un exemple très simple qui résume le problème à son cœur:

models.py

current_author.book_one = ratings_dictionary['book_one']
current_author.book_two = ratings_dictionary['book_two']
current_author.book_three = ratings_dictionary['book_three']
current_author.save()

views.py

from models import author_ratings

ratings_dictionary = {'book_one': 10, 'book_two': 20, 'book_three': 30}

current_author = author_ratings.objects.filter(name="Jim")

for book,rating in ratings_dictionary:
    current_author.book = rating
    current_author.save()

Le problème: au lieu d'enregistrer les valeurs de 10, 20 et 30 dans le fichier correspondant colonnes de la ligne de cet auteur, Django renvoie l'erreur suivante:

"AttributeError: l'objet 'current_author' n'a pas d'attribut 'book'"

EDIT: Dans les réponses ci-dessous, Shafikur Rahman souligne correctement que «livre» n'est pas un champ disponible (seuls «nom», «livre_un», «livre_deux» et «livre_trois» sont disponibles). Ma question devient: comment utiliser une boucle for pour mettre à jour chaque champ sans avoir à tous les coder en dur?

Par exemple, je veux éviter d'avoir à taper explicitement chaque colonne:

XXX

Les informations ci-dessus devraient être suffisantes pour bien comprendre la question, mais je peux fournir d'autres détails sur demande. Merci d'avance pour toute aide.


0 commentaires

3 Réponses :


1
votes

Votre modèle author_ratings n'a pas de champ livre donc c'est par erreur. Les champs disponibles sont name , book_one , book_two et book_three


2 commentaires

Merci pour la réponse. Je suppose que ma question est la suivante: comment utiliser une boucle for pour éviter d'avoir à coder en dur chaque champ? Par exemple, si j'ai 100 colonnes à mettre à jour, je préfère ne pas avoir à lister les 100 champs pour chaque auteur.


D'accord. Quelque chose que je dois clarifier. Pouvez-vous nous donner une idée de votre "notes_dictionary"?



1
votes

Dans views.py, vous pouvez:

from models import author_ratings

ratings_dictionary = {'book_one': 10, 'book_two': 20, 'book_three': 30}

current_author = author_ratings.objects.filter(name="Jim")

current_author.update(**ratings_dictionary)

Vous pouvez en savoir plus sur update dans la documentation .


0 commentaires

2
votes

Avec current_author = author_ratings.objects.filter (name = "Jim") vous récupérez un QuerySet , pas une instance de modèle. Donc, en faisant

   current_author.book_one = ratings_dictionary['book_one']
   current_author.book_two = ratings_dictionary['book_two']
   current_author.book_three = ratings_dictionary['book_three']
   current_author.save()

, vous obtiendrez toujours des erreurs. L'objet 'QuerySet' n'a pas d'attribut 'save' au moins.

Mais les ensembles de requêtes ont la méthode update , qui pourrait vous faire gagner quelques lignes de code si vous n'insistez pas pour utiliser une boucle:

current_author.update (** Ratings_dictionary) est tout ce dont vous avez besoin


0 commentaires