0

模型:

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

现在我想获取最常用产品的列表:

ReceiptComponent.objects.values('product').annotate(Count('product')).order_by('-product__count'

示例结果:

[{'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}]

这几乎是我需要的。但我更喜欢 Product 对象而不是产品价值,因为我想在 views.py 中使用它来生成列表。

4

1 回答 1

0

如果我没记错的话,这具有相同的行为但对象?

Product.objects.all().annotate(usecount=Count('receipt_set')).order_by('-usecount')
于 2010-06-09T11:17:45.770 回答