2010-09-13 10 views
1

J'essaie de changer un champ spécifique d'un champ dans un objet que j'ai récupéré d'un appel django db.Django, Python, essayant de changer les valeurs/attributs de champ dans un objet récupéré à partir d'objets DB.all appel, ne fonctionne pas

class Dbobject() 
    def __init__(self): 
     dbobject = Modelname.objects.all() 
    def test (self): 
     self.dbobject[0].fieldname = 'some new value' 

alors je suis en mesure d'accéder à un attribut spécifique comme ceci:

objclass = Dbobject() 
fieldvalue = dbobject.dbobject[0].fieldname 

mais je veux être en mesure d'utiliser la méthode « test » de la classe dbobject pour essayer de changer la valeur spécifique sur la valeur de l'attribut d'un objet, mais il ne le change pas. Je suis perplexe parce que c'est ainsi que j'ai pensé que je devais changer la valeur d'attribut d'un objet.

Répondre

7

Je ne suis pas sûr que ce soit le problème ou non, mais je pense que vous pourriez manque une méthode save().

from models import Person 
p = Person.objects.get(pk=100) 
p.name = 'Rico' 
p.save()  # <== This writes it to the db. Is this what you're missing? 

Ci-dessus est le cas simple. Adapté pour ce que vous avez écrit ci-dessus, ce serait comme:

dbobject.dbobject[0].fieldname = 'some new value' 
dbobject.dbobject[0].save() 

ou, je l'écrire plus comme:

rec = dbobject.dbobject[0] 
rec.fieldname = 'some new value' 
rec.save() 

Notez également que selon que et la façon dont vous utilisez les transactions, vous pouvez ou ne pouvez pas voir une modification à la base de données jusqu'à ce que vous commettiez.

+0

Je n'essaie pas de mettre à jour la base de données avec ceci, juste pour changer la valeur dans l'objet, j'ai écrit une autre méthode pour prendre l'objet et l'enregistrer sur la base de données, l'idée est que – Rick

+0

Je suppose que ce que j'essaie de faire est un peu comme émuler l'équivalent d'un appel à get.all qui ne semble pas exister dans Django, je suppose que je ne comprends pas pourquoi je ne peux pas changer les valeurs de l'objet qui est créé à partir des objects.all (juste de mon côté local, car je sais que je ne peux pas l'utiliser pour mettre à jour la base de données – Rick

+0

Vous pouvez modifier la valeur d'instance d'un objet, pas de problème. Quelque chose ne va pas avec vos trucs fantaisie que vous faites. Peut-être que vous manquez un "soi". dans votre méthode init? Peut-être que vous vouliez que la ligne 3 soit self.dbobject = Modelname.objects.all(). Si ce n'est pas ça, alors je ne suis pas sûr de ce que vous faites ici. Il y a certainement un appel à get.all(), c'est comme Person.objects.all(). Pouvez-vous m'aider à comprendre ce que vous demandez, si ce n'est pas ça? – Unoti

0

Je ne suis pas tout à fait sûr de ce que vous essayez d'atteindre, mais il ne devrait pas être quelque chose comme:

class Dbobject(): 
    def __init__(self): 
     self.dbobject = Modelname.objects.all() 
    def test (self): 
     self.dbobject[0].fieldname = 'some new value' 
+0

mon erreur, je l'ai eu avec soi dans ma méthode dans la classe, je l'ai juste copié sur faux comme je l'avais essayé d'une instance de la classe aussi (en dehors de la classe, où l'instance était 'dbobject'), de toute façon, cela ne fonctionne pas quel est le problème et je ne peux pas comprendre pourquoi – Rick

+1

avez-vous également mis le «self» dans la méthode __init__? –