2014-01-26 3 views
6

Ich habe ein Produktmodell mit einem Fremdschlüssel zu einigen Preisen, und ich möchte wirklich die Produkte mit dem "besten" Angebot auflisten ... How to do Das?Django Filter Modell One-to-Many Beziehung, größter Unterschied zwischen den Preisen

class Product(models.Model): 
    productname = models.CharField(max_length=1024) 

class Price(models.Model): 
    product = models.ForeignKey(Product) 
    price = models.DecimalField(max_digits=10, decimal_places=2) 
    created = models.DateTimeField(auto_now_add=True) 

Zuerst möchte ich alle Produkte mit mehr als einem Preis, das ich habe:

ps = Product.objects.annotate(c=Count("price")).filter(c__gt=2) 

Jetzt möchte ich die besten 6 Produkte mit dem größten diff zwischen den beiden aktuellen Preise.

Kann mir jemand dabei helfen? Ich hoffe, dass es Sinn macht;)

Antwort

6

Sie die StdDev (Standardabweichung) Aggregator verwenden können, So könnte Ihr Abfrage-Set wie folgt aussehen:

das beste Angebot Preis ist ps[0].min_price

Hoffe, das hilft

+0

Beachten Sie, dass dies nicht mit sqlite verwendet werden kann ... mehr auf https://docs.djangoproject.com/de/1.6/ref/models/querysets/#stddev – juliocesar

+0

Wissen Sie, wie man nur die Produkte, wo die letzter Preis ist der niedrigste? ;) – pkdkk

4

einfache Art und Weise -

class Product(models.Model): 
    productname = models.CharField(max_length=1024) 
    price_diff = models.DecimalField(max_digits=10, decimal_places=2, default=0) 

Verwendung Signale vordefinierten Feld verwenden oder außer Kraft speichern und löschen:

class Price(models.Model): 
    product = models.ForeignKey(Product) 
    price = models.DecimalField(max_digits=10, decimal_places=2) 
    created = models.DateTimeField(auto_now_add=True) 
    def save(self, **kwargs): 
     ... 
     #calaculate you largest diff and put in product 
     ... 
+0

Zustimmen. Dies wäre die einfachste Implementierung. – arocks