11 Stimmen

Wie aktualisiere ich die Mitglieder eines Objekts mit einem Diktat?

Ich schreibe eine Django-App, die verschiedene Funktionen ausführt, einschließlich Einfügen oder Aktualisieren neuer Datensätze in der Datenbank über die URL.

Eine interne Anwendung sendet also eine Anfrage an /import/?a=1&b=2&c=3 zum Beispiel. In der Ansicht möchte ich ein neues Objekt erstellen, foo = Foo() und haben die Mitglieder von foo auf die Daten im request.GET-Wörterbuch gesetzt.

Das tue ich jetzt:

  1. Anfrage gesendet an /import/?a=1&b=2&c=3
  2. Ansicht erstellt neues Objekt: foo = Foo()
  3. Das Objekt wird mit Daten aktualisiert.

Hier ist, was ich bis jetzt habe:

foo.a = request['a']
foo.b = request['b']
foo.c = request['c']

Dies ist natürlich mühsam und fehleranfällig. Die Daten in der URL haben genau denselben Namen wie die Mitglieder des Objekts, so dass es sich um eine einfache 1:1-Zuordnung handelt.

Im Idealfall würde ich gerne so etwas tun können:

foo = Foo()
foo.update(request.GET)

oder etwas in dieser Richtung.

Danke!

19voto

Ants Aasma Punkte 50286

Sie können die Funktion setattr verwenden, um Attribute dynamisch zu setzen:

for key,value in request.GET.items():
    setattr(foo, key, value)

3voto

tzot Punkte 86792

Si request.GET ist ein Wörterbuch und class Foo verwendet nicht __slots__ dann sollte dies auch funktionieren:

# foo is a Foo instance
foo.__dict__.update(request.GET)

1voto

Daniel Roseman Punkte 565786

Sie haben es fast geschafft.

foo = Foo(**request.GET)

sollte das genügen.

1voto

Wenn Sie dies verwenden, um ein Modellobjekt zu erstellen, das dann persistiert wird, würde ich dringend empfehlen, eine ModelForm . Dies würde tun, was Sie beschrieben, in der kanonischen Weise für Django, mit dem Zusatz von Validierung.

Ich wollte es nicht für die Formularausgabe, sondern nur für die Formulareingabe verwenden. Wie folgt:

class Foo(models.Model):
      a = models.CharField(max_length=255),
      b = models.PositiveIntegerField()

class FooForm(forms.ModelForm):
      class Meta:
          model = Foo

def insert_foo(request):
      form = FooForm(request.GET)
      if not form.is_valid():
          # Handle error conditions here
          pass
      else:
          form.save()

      return HttpResponse('Your response')

Ein GET an /import/?a=Test&b=1 würde ein neues Foo mit a = "Test" und b="1" einfügen, vorausgesetzt es ist an /import/ gebunden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X