Django Aggregation mit Objekten
-
25-09-2019 - |
Frage
Modell:
class Product(models.Model):
name = models.CharField(max_length = 128)
(...)
def __unicode__(self):
return self.name
class Receipt(models.Model):
name = models.CharField(max_length=128)
(...)
components = models.ManyToManyField(Product, through='ReceiptComponent')
def __unicode__(self):
return self.name
class ReceiptComponent(models.Model):
product = models.ForeignKey(Product)
receipt = models.ForeignKey(Receipt)
quantity = models.FloatField(max_length=9)
unit = models.ForeignKey(Unit)
def __unicode__(self):
return unicode(self.quantity!=0 and self.quantity or '') + ' ' + unicode(self.unit) + ' ' + self.product.genitive
Und jetzt würde Ich mag die Liste der am häufigsten verwendbaren Produkten erhalten:
ReceiptComponent.objects.values('product').annotate(Count('product')).order_by('-product__count'
Das Beispiel Ergebnis:
[{'product': 3, 'product__count': 5}, {'product': 6, 'product__count': 4}, {'product': 5, 'product__count': 3}, {'product': 7, 'product__count': 2}, {'product': 1, 'product__count': 2}, {'product': 11, 'product__count': 1}, {'product': 8, 'product__count': 1}, {'product': 4, 'product__count': 1}, {'product': 9, 'product__count': 1}]
Es ist fast, was ich brauche. Aber ich würde es vorziehen, Product-Objekt nicht Produkt-Wert, weil ich mag dies zum Erzeugen Liste in views.py verwenden.
Lösung
Wenn ich mich nicht irre hat dies das gleiche Verhalten aber mit Objekten?
Product.objects.all().annotate(usecount=Count('receipt_set')).order_by('-usecount')
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow