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.
3 Réponses :
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
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"?
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 .
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