Django QuerySet

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

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
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Natürlich hätte man das auch so lösen können :roll:

Vielen dank!

Was bedeutet denn das "property"?!
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Django Templates machen automatisch Funktionsaufrufe (ohne Parameter). Das ist auch ein Unterschied zu Jinja, das sowas nicht von selbst macht.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Achso..., dann hatte ich das wohl falsch in Erinnerung (ich dachte, dass ist prinzipiell nicht möglich).
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Zuletzt geändert von sma am Donnerstag 18. Juni 2009, 21:57, insgesamt 1-mal geändert.
nemomuk
User
Beiträge: 862
Registriert: Dienstag 6. November 2007, 21:49

Ich finde das Django ORM irgendwie sehr merkwürdig an manchen Stellen...
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Ich hätte ja gehofft, es ging so oder so ähnlich:

Code: Alles auswählen

Product.objects.values(mws=F('price') * 0.19)
Stefan
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

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?!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
BerlinerMC
User
Beiträge: 25
Registriert: Montag 8. Dezember 2008, 19:32

Danke nochmal

da muss ich Blind gewesen sein :?
Antworten