[Django] Zum Queryset Daten hinzufügen

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Guten Morgen,

folgende Situation:
Ich speichere Werte in einer Tabelle. Als Beispiel hier mal Zahlenpaare. Mein Ziel ist es, eine Tabelle zu erzeugen, in der in den ersten beiden Spalten die Zahlen und in der Dritten irgendein Ergebnis aus einer Berechnung mit den beiden Zahlen stehen,
also in etwa so:

Code: Alles auswählen

<table>
<tr><td>A</td><td>B</td><td>A+B</td></tr>
<tr><td>3</td><td>5</td><td>8</td></tr>
[...]
</table>
Ich dachte mir das ich dafür ja schön die Genreric Views nutzen kann, die Django anbietet, leider habe ich aber noch nicht herausgefunden wie ich die 3te Spalte, die in der Datenbank nicht vorhanden ist, hinzufügen kann.
Das muss ja irgendwo in der view-funktion passieren:

Code: Alles auswählen

def Myview(request):
     list = Mymodel.objects.all()
    #hier irgendwie list manipulieren
    return object_list(request, queryset=list)
So funktioniert es leider nicht:

Code: Alles auswählen

for elem in list:
    elem["c"] = ...
Das extra_context-Dictionary ist leider auch keine Lösung, da ich auf die Werte in dem Template nicht vernünftig zugreifen kann, oder kennt da jemand eine Lösung?
Das Template sieht ja ungefähr so aus:

Code: Alles auswählen

<table>
    {% for elem in object_list %}
    <tr>
        <td>{{elem.a}}</td>
        <td>{{elem.b}}</td>
        <td>/*hier müsste dann irgendwie auf das _passende_ element aus dem extra_context zugegriffen werden</td>
    </tr>
    {% endfor %}
</table>
Also, nach dem ganzen Bla Bla:
weiß jemand, wie ich
a) dem Queryset neue Daten hinzufügen kann, oder
b) in dem Template so auf den extra_context zugreifen kann, das ich immer den passenden Wert erhalte?

Meine beiden letzten Fallback-möglichkeiten wären, das ich entweder nicht die generic_views nutze, oder das ich die benötigte Spalte schon in das Model integriere.
Es wiederstrebt mir, Daten doppelt zu speichern, weswegen mir die extra Spalte in der Tabelle nicht ganz geheuer ist (wenn ich A und B schon gespeichert habe, habe ich dadurch ja auch A+B),
und die Generic Views würde ich wegen der vielen Hilfsmittel, die sie anbieten (pagination etc), gerne nutzen.

danke,
r.
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

.robert hat geschrieben:Also, nach dem ganzen Bla Bla:
weiß jemand, wie ich
a) dem Queryset neue Daten hinzufügen kann, oder
Nein, dass willst du nicht tun ;) Wenn schon bekommt ldas model eine Methode dafür:

Code: Alles auswählen

class Mymodel(models.model):
  field_a = models.SomeField()
  field_b = models.AnotherField()
  def calculate_extra(self):
     retun self.field_a + self.field_b #simplified
Im Template kannst du dann einfach mit object.calculate_extra auf den Wert zugreifen...
b) in dem Template so auf den extra_context zugreifen kann, das ich immer den passenden Wert erhalte?
Nein Du kannst dir aber einen Templatetag schreiben, der die 2 Werte nimmt, addiert und wieder ausgibt: http://www.djangoproject.com/documentat ... es_python/

MfG apollo13
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

Ui, auf die Idee, die Berechnung in das Model zu packen (wo sie ja eigentlich auch hingehört :oops: ) bin ich gar nicht gekommen.
So funktioniert es natürlich wunderbar.

Vielen Dank!
:D
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

apollo13 hat geschrieben:Wenn schon bekommt ldas model eine Methode dafür:

Code: Alles auswählen

class Mymodel(models.model):
  field_a = models.SomeField()
  field_b = models.AnotherField()
  def calculate_extra(self):
     retun self.field_a + self.field_b #simplified
Bitte noch ein @property oben drauf, dann siehts auch schicker in Python und jeder Template Engine != Django aus :)
TUFKAB – the user formerly known as blackbird
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

mitsuhiko hat geschrieben:Bitte noch ein @property oben drauf, dann siehts auch schicker in Python und jeder Template Engine != Django aus :)
Du meinst jetzt x.some_stuff vs x.some_stuff()? Klar, aber er verwendet nur Django ;)
.robert
User
Beiträge: 274
Registriert: Mittwoch 25. April 2007, 17:59

apollo13 hat geschrieben:Klar, aber er verwendet nur Django ;)
Das hört sich ja an als ob das ein Verbrechen wär... :wink:
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Nein definitiv nicht, auch Django hat seine use cases und ist vor allem für CRUD Sachen super und einfach. Aber du wirst vlt. einmal merken, dass ein Framework (und zwar egal welches), dich immer irgendwo limitiert und schlussendlich (vor allem bei großen Systemen) die Nachteile meist überwiegen.
Antworten