Seite 1 von 1

Django QuerySet

Verfasst: Dienstag 16. Juni 2009, 20:08
von BerlinerMC
Hallo Community,

ich komme leider nicht mehr weiter, trotz Recherche des ganzen Tages, was ein immer aufhält -.-

Also mein Problem ist folgendes:
Ich habe ein Model welches sich "Product" nennt. Dort habe ich z.B. ein Attribut "price"!

Nun gebe ich alle gespeicherten Produkte aus, möchte aber das auf den Preis die Mehrwertsteuer mitberechnet wird. Gibt es irgendeine Methode die das Realisieren kann?! Also wie z.B. das SQL Statement:

Code: Alles auswählen

SELECT (price * 0.19) AS mws FROM Product
Desweiteren wäre interessant zu wissen ob man das "dict" des Query Sets irgendwie erweitern kann?! Versuche ich das dict des QuerySets zu erweitern mit den normal Python methoden bekomme ich eine Fehlermeldung das das QuerySet dieses Attribut / Methode nicht hat.

Also z.B. geht folgendes nicht:

Code: Alles auswählen

data = Product.objects.all()
gebe ich das in der Shell aus, sieht es für mich wie ein Dict aus!

also könnte ja folgendes klappen

Code: Alles auswählen

data.clean()
Aber eben dort bekomme ich eine Fehlermeldung, sowie mit allen anderen Methoden! Somit kann ich das "Dict" / "SQL Ergebnis" nicht mit eigenen Werten erweitern.

Lg
Berliner / Alex

Verfasst: Dienstag 16. Juni 2009, 20:18
von nemomuk
Warum nicht einfach dein Model erweitern um eine weitere Methode:

Code: Alles auswählen

class Product(models.Model):

     ....

    @property
    def price_plus_mwst(self):
        return self.price * 1.19


>>> product.price_plus_mwst
123.12

Verfasst: Dienstag 16. Juni 2009, 21:30
von BerlinerMC
Natürlich hätte man das auch so lösen können :roll:

Vielen dank!

Was bedeutet denn das "property"?!

Verfasst: Dienstag 16. Juni 2009, 21:42
von nemomuk
http://docs.python.org/library/functions.html#property

Ist nicht zwingend notwendig, du sparst dir halt das:

Code: Alles auswählen

product.price_plus_mwst()
Und greifst somit auf ein "Attribut" deiner Instanz zu - ich finde es so schöner... vor allem kannst du es dann auch in deinen DjangoTemplates verwenden (wenn ich mich richtig erinnere), was im anderen Fall nicht möglich ist.

Verfasst: Dienstag 16. Juni 2009, 23:11
von Leonidas
Django Templates machen automatisch Funktionsaufrufe (ohne Parameter). Das ist auch ein Unterschied zu Jinja, das sowas nicht von selbst macht.

Verfasst: Mittwoch 17. Juni 2009, 05:08
von nemomuk
Achso..., dann hatte ich das wohl falsch in Erinnerung (ich dachte, dass ist prinzipiell nicht möglich).

Verfasst: Donnerstag 18. Juni 2009, 21:45
von sma
Ein `select price*0.19 as mws from product` entspricht in Django

Code: Alles auswählen

Product.objects.extra(select={'mws':'price * 0.19'}).values('mws')
Ich hätte gedacht, dass die neue F-Syntax hier helfen könnte, aber damit scheint es nicht möglich zu sein, neue Felder einzuführen, sondern man kann sie nur innerhalb von filter-Ausdrücken benutzen.

Stefan

Verfasst: Donnerstag 18. Juni 2009, 21:54
von nemomuk
Ich finde das Django ORM irgendwie sehr merkwürdig an manchen Stellen...

Verfasst: Donnerstag 18. Juni 2009, 21:57
von sma
Ich hätte ja gehofft, es ging so oder so ähnlich:

Code: Alles auswählen

Product.objects.values(mws=F('price') * 0.19)
Stefan

Verfasst: Donnerstag 18. Juni 2009, 22:17
von BerlinerMC
Ich habe mal noch eine schöne frage...

Ich Programmiere nun ein Profil wo man seine Daten nach dem Registrieren ändern kann.

Bietet Django eine Möglichkeit das Query Set auszulesen und die Werte in ein ModelForm einzufügen?! Also so das ich nirgends das "value = 'Gespeicheter Wert' " einfügen zu müssen?!

Verfasst: Donnerstag 18. Juni 2009, 23:11
von Leonidas
BerlinerMC hat geschrieben:Bietet Django eine Möglichkeit das Query Set auszulesen und die Werte in ein ModelForm einzufügen?! Also so das ich nirgends das "value = 'Gespeicheter Wert' " einfügen zu müssen?!
Ja, klar, ist auch einfach in der Doku auffindbar.

Verfasst: Donnerstag 18. Juni 2009, 23:14
von BerlinerMC
Danke nochmal

da muss ich Blind gewesen sein :?