Skip to main content
 首页 » 编程设计

python之Django:注释每个对象的重复值个数的计数

2024年08月15日28lvdongjie

我有一个名为 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 

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

请您参考如下方法:

第一个愿望是使用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 中找到有关此查询如何工作的详细信息