Django:注释每个对象重复值的数量

时间:2018-07-24 21:31:21

标签: python django annotations

下面有一个名为Product的模型。产品可以具有相同的字段“ bc_sku”。

class Product(models.Model)

    bc_sku                          = models.IntegerField(null=True, blank=True)
    product_type                    = models.CharField(null=True, blank=True, max_length=50)
    merchant                        = models.CharField(null=True, blank=True, max_length=50)
    product_price                   = models.DecimalField(null=True, blank=True, max_digits=10, decimal_places=2)

例如,假设我有这个对象列表

    bc_sku | product_type | merchant | product_price
    100    | good         | A        | 1.00
    100    | bad          | B        | 2.00
    100    | bad          | C        | 3.00
    101    | good         | A        | 7.00
    101    | bad          | B        | 5.00

我想做的是创建一个查询,该查询用重复数量和每个'bc_sku'的最低价格来注释每个“好”产品。然后,我希望能够在模板中使用这些对象和值。

    bc_sku | product_type | merchant | dup_count | min_price
    100    | good         | A        | 3         | 1.00
    101    | good         | A        | 2         | 5.00

任何帮助都将不胜感激,因为我正努力获取注释和过滤器以使其当前有效。

1 个答案:

答案 0 :(得分:3)

第一个愿望是使用window function,但不幸的是not allowed 组合了annotate(Window(...))filter(...)

答案是:

from django.db.models import OuterRef, Subquery, Count, Min

subquery = Product.objects.filter(bc_sku=OuterRef('bc_sku')).values('bc_sku')
                          .annotate(dup_count=Count('*'), min_price=Min('product_price'))
Product.objects.filter(product_type='good')
               .annotate(dup_count=Subquery(subquery.values('dup_count')), 
                         min_price=Subquery(subquery.values('min_price')))

您可以在docs

中找到有关此查询的工作方式的详细信息