Methode in Modell übergeben DJANGO

Django, Flask, Bottle, WSGI, CGI…
Antworten
djangothoto
User
Beiträge: 24
Registriert: Freitag 10. September 2010, 10:12

Hallo liebe Experten,
ich habe folgendes Problem:
Ich möchte eine Methode in meinem Modell schreiben, inder eine Preisberechnung der restlichen Modells durchgeführt wird!

Kurze Erläuterung wie das ganze aussieht:
Das Komplettsystem-Modell setzt sich aus mehreren anderen Modell zusammen, welche alle einen Preis besitzen.
Der Komplettsystem-Preis soll sich also aus den anderen Moddelpreisen zusammensetzen.

Ich habe es schon mit einem Manager probiert, jedoch bekomm ich das ganze nicht zum laufen.


models.py

Code: Alles auswählen

class Celsius(models.Model):
    name = models.CharField(max_length = 200)
    price = models.IntegerField()
    
    def __unicode__(self):
        return self.name


class CPU(models.Model):
    name = models.CharField(max_length = 200)
    cpufsb = models.IntegerField()
    cpughz = models.DecimalField(max_digits=4, decimal_places=2)
    cpukerne = models.IntegerField()
    price = models.IntegerField()

    def __unicode__(self):
        return self.name


class Grafikkarte(models.Model):
    name = models.CharField(max_length = 200)
    grafikspeicher = models.IntegerField()
    price = models.IntegerField()

    def __unicode__(self):
        return self.name


class RAM(models.Model):
    name = models.CharField(max_length = 200)
    ramspeicher = models.IntegerField()
    anzahlspeicher = models.IntegerField()
    price = models.IntegerField()

    def __unicode__(self):
        return self.name

class Software(models.Model):
    name = models.CharField(max_length = 200)
    price = models.IntegerField()

    def __unicode__(self):
        return self.name

class Hardware(models.Model):
    name = models.CharField(max_length = 200)
    anzahlkomponenten = models.IntegerField()
    price = models.IntegerField()

    def __unicode__(self):
        return self.name

class Benchmark(models.Model):
    name = models.CharField(max_length = 200)
    ergebnis = models.DecimalField(max_digits=5, decimal_places=2)

    def __unicode__(self):
        return self.name


class KomplettPreisManager(models.Manager):
    def get_query_set(self):
        row = self.model.all()
        for i in row:
            preis = i.celsius.price + i.cpu.price + i.grafikkarte.price + i.ram.price + i.software.price + i.hardware.price
        return preis



class Komplettsystem(models.Model):
    
    name = models.CharField(max_length = 200)
    pub_date = models.DateTimeField('date published')
    benchmark = models.ForeignKey(Benchmark)
    celsius = models.ForeignKey(Celsius)
    cpu = models.ForeignKey(CPU)
    grafikkarte = models.ForeignKey(Grafikkarte)
    ram = models.ForeignKey(RAM)
    software = models.ForeignKey(Software)
    hardware = models.ForeignKey(Hardware)
    erg = KomplettPreisManager()
    
    def __unicode__(self):
        return self.name
Ich hoffe ihr könnt mir weiterhelfen!

lg thoto
Nobody is perfect!
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

get_query_set __muss__ ein Queryset zurückliefern und keinen Preis… Mal abgesehen davon; dass die Methode so auch kaputt ist, da Sie den Preis eines Systems ermitteln würde…
BlackJack

@djangothoto: Ich weiss nicht ob ich das Problem richtig verstehe, aber kannst Du nicht eine `berechne_komplettpreis()`-Methode auf `Komplettsystem` definieren?
djangothoto
User
Beiträge: 24
Registriert: Freitag 10. September 2010, 10:12

@BlackJack
So in etwa ich weiss nicht ob es so funktioniert XD

Code: Alles auswählen

    def Preis(self):
        Komplettsysteme = Komplettsystem.objects.all()
        for i in Komplettsysteme:
            erg = i.celsius.price + i.cpu.price + i.grafikkarte.price + i.ram.price + i.software.price + i.hardware.price
        return self.erg
hatte ich auch schonmal drin allerdings hat es "so" auch nicht funktioniert!
Irgendwas mach ich falsch ich weiss nur nicht was :?
Nobody is perfect!
BlackJack

@djangothoto: Das scheint mir ein grundsätzliches Logikproblem zu sein. Warum ermittelst Du da alle Komplettsysteme und berechnest von allen den Preis, wirfst aber von allen bis auf dem Letzten das Ergebnis wieder weg!? Und wo kommt `self.erg` her?
djangothoto
User
Beiträge: 24
Registriert: Freitag 10. September 2010, 10:12

Vielen Dank für eure Tipps und Hilfe ich habs jetzt geschafft!

War ja doch nicht so schwer :oops:

Ergebnis:

Code: Alles auswählen

def preis(self):
        erg = self.celsius.price + self.cpu.price + self.grafikkarte.price + self.ram.price + self.software.price + self.hardware.price
        return erg
Nobody is perfect!
Antworten