2009-10-06 8 views
1
thechan = Score.objects.filter(content=44)[0:1] 
thechan[0].custom_score = 2 
thechan[0].save() 

je fais des déclarations d'impression, et il montre tout va bien. Cependant, ce n'est pas économiser!Pourquoi ne puis-je pas enregistrer un objet dans Django?

je vais dans ma base de données, et je lance un SELECT simple statement..and ce n'est pas changé!

select custom_score FROM music_score where content_id = 44; 

Répondre

11

Qu'est-ce qui se passe ici est que Score.objects.filter() ne retourne pas une liste régulière, mais un QuerySet. QuerySets se comportent comme des listes, à certains égards, mais chaque fois que vous coupez un vous obtenez une nouvelle instance QuerySet, et chaque fois que vous index en un seul, vous obtenez une nouvelle instance de votre classe de modèle.

Cela signifie que votre code d'origine fait quelque chose comme:

thechan = Score.objects.filter(content=44)[0:1] 
thechan[0].custom_score = 2 

thechan = Score.objects.filter(content=44)[0:1] 
thechan[0].save() # saves an unmodified object back to the DB, no effective change 

Si pour une raison quelconque vous avez besoin de faire cela sur un QuerySet plutôt que d'utiliser simplement get(), vous pouvez écrire:

thechan = Score.objects.filter(content=44)[0] 
thechan.custom_score = 2 
thechan.save() 

à la place. Cette distinction devient un peu plus important si vous êtes, par exemple, itérer sur les éléments d'un QuerySet au lieu de traiter avec un seul enregistrement.

0

Fixé.

thechan = Score.objects.get(content=44) 
thechan.custom_score = 2 
thechan.save() 
+0

Euh ... quoi? Comment fonctionne ce code? – harto

+0

2 avertissements: Django soulèvera pour vous: « MultipleObjectsReturned: get() est revenu plus d'un titre » et, si plus de 1 « contenu », soulèvera Object.DoesNotExist si aucun résultat. – panchicore

Questions connexes