Unterschied zwischen Setattr und Objektmanipulation in Python / Django
Ich habe Folgendes Modell:
class Ticket(models.Model):
title = models.CharField()
merged_to = models.ForeignKey("self", related_name='merger_ticket', null=True, blank=True)
looser_ticket = models.BooleanField(default=False)
Es gibt einige Möglichkeiten der Manipulation des Modells:
Ersten
ticket = Ticket.objects.get(pk=1)
ticket.title = "This is edit title"
ticket.merged_to_id = 2
ticket.looser_ticket = True
Zweiten
ticket = Ticket.objects.get(pk=1)
setattr(ticket, "title", "Edit Title")
setattr(ticket, "merged_to_id", 2)
setattr(ticket, "looser_ticket", True)
Wenn ich manipulierte das Zeug, in Aussicht für den booleschen Wert updation die erste Methode hat nicht funktioniert, aber die zweite Methode hat funktioniert. Was ist der Unterschied zwischen der Verwendung von ersten und zweiten, und Wann sollte Sie eingesetzt werden?
Dank!
Kommentar zu dem Problem - Öffnen
was meinst du mit "nicht funktionieren"?
ah tatsächlich, da war ein Tippfehler, und die Werte wurden nicht in die Datenbank gespeichert.
InformationsquelleAutor der Frage whatf | 2012-10-09
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist eher eine Python-Frage.
Python ist eine sehr dynamische Sprache. Sie können code Dinge (Klassen) der Zeit Voraus, oder Python ermöglicht Ihnen das erstellen von Klassen vollständig dynamisch zur Laufzeit. Betrachten Sie das folgende Beispiel für eine einfache Vektor-Klasse. Sie können erstellen/code der Klasse vor der Zeit wie:
oder erstellen Sie die Klasse dynamisch durch tun:
Der Hauptunterschied zwischen den Methoden ist, dass für Sie wissen, die Attribute der Klasse und vor der Zeit, in der Erwägung, dass für die zweite Methode, wie Sie sich vorstellen können, können Sie programmgesteuert erstellen, die
fields
Wörterbuch, daher können Sie erstellen, die komplett dynamisch, Klasse(N).Also, wenn Sie wissen, die Attribute der Klasse vor der Zeit, können Sie Attribute der Klasse mit dem Objekt-notation:
Beachten Sie, dass äquivalent ist:
Jedoch gibt es Szenarien, in denen Sie nicht wissen, die Attribute der Klasse werden Sie brauchen, um zu manipulieren, vor der Zeit. Dies ist, wo Sie verwenden können
__setattr__
Funktion. Es ist jedoch nicht empfohlen. Anstatt also die Empfehlung ist die Verwendung von Python-build-in-Methodesetattr
die ruft intern die__setattr__
Methode:Mit diesem Ansatz kann man Attribute festlegen, die Sie nicht im Voraus wissen, oder Sie können auch loop von einigen
dict
Werte und legen Sie Werte von dict:Nicht sicher, warum die reguläre notation hat nicht funktioniert. Es hat wahrscheinlich nichts mit der Methode, die Sie verwendet, um Attribute.
InformationsquelleAutor der Antwort miki725
Wenn Sie wissen, die Objekte, Eigenschaften, bevor die hand, sollten Sie wahrscheinlich die erste Methode. Weisen Sie einfach der Eigenschaft Werte direkt.
Zweiten kann nützlich sein, wenn Sie brauchen, um dynamisch einen Wert zuweisen einer Eigenschaft. Vielleicht hat ein Benutzer die Möglichkeit zum ändern der Werte von verschiedenen Parametern, und Sie weiß nicht, was man einen Wert haben wird, vor der hand, Sie können dynamische Werte hinzufügen
"Funktioniert nicht" ist wohl nicht abhängig von der Art und Weise Sie setzen Werte, sind Sie sicher, dass Sie speichern Ihre änderungen danach??
InformationsquelleAutor der Antwort dm03514