2017-08-07 2 views
0

Ich habe drei Modelle:Django Queryset - Wie berechne ich verwandte Modelle mit prefetch_related?

class Variety(models.Model) 
    name = models.CharField(max_length=24) 

class Item(models.Model) 
    name = models.CharField(max_length=24) 
    in_stock = models.IntegerField() 

class ItemPart(models.Model)   
    variety = models.ForeignKey(Variety) 
    product = models.ForeignKey(Product) 
    qty = models.IntegerField() 

Ich mag sagen, wie viel von jeder Sorte in Artikel gemacht wurde, indem alle im Zusammenhang ItemParts bekommen und ihre qty durch die in_stock ihre verwandten Artikel zu multiplizieren.

Ich habe so weit gekommen:

Variety.objects.all().prefetch_related('itempart_set').values('name').annotate(
    Sum(F("itempart_set__qty") * F("itempart_set__item_set__in_stock") 
) 

Wird diese Arbeit? Wird es die Produkte summieren, oder wird es einfach die Summen multiplizieren?

+0

"Wird das funktionieren?" Hast du es versucht_? Sicher wäre das einfacher gewesen, als eine Frage zu Stack Overflow zu stellen ... – Chris

+0

Nun, ich versuche meine Modelle richtig zu entwerfen. Also musste ich sie aufbauen, eine Menge gefälschter Daten eingeben und es versuchen. Ich hatte gehofft, dass jemand bestätigen könnte, bevor ich die Mühe mache, sie falsch zu bauen. –

Antwort

1

Sie können keine Mathematik mit Modellen erstellen, die von prefetch_related abgefragt wurden, da prefetch_related die Datenbank unabhängig von der ursprünglichen Abfrage trifft. Ihr Queryset wird wahrscheinlich auf zwei Datenbankabfragen ausgewertet, und eine Berechnung auf Datenbankebene kommt in diesem Fall nicht in Frage.

Nun, ich sage nicht, dass die obige Abfrage nicht funktioniert (Django funktioniert seine Magie und schließlich wissen wir nicht, welche Version Sie verwenden), aber ich sage, dass die prefetch_related wird gibt Ihnen keinen Leistungsschub für die Berechnung.

Wenn das obige nicht funktioniert, würde ich versuchen, es mit Unterabfragen in Django 1.11 eingeführt.

+0

Danke! Das wollte ich wissen. –

+0

@AdamStarrh Wenn Sie das wissen wollten, dann markieren Sie es vielleicht auch als die richtige Antwort? – makaveli

+1

Dachte ich hatte das angeklickt. Danke für den Fang –

Verwandte Themen