【问题标题】:How to Group product based on brand & fetch min price product in django如何根据品牌对产品进行分组并在 django 中获取最低价格产品
【发布时间】:2020-06-26 02:46:03
【问题描述】:

我有两张表,一张是品牌,另一张是产品,现在产品有 1 个外国品牌 ID。

1 个品牌有多种价格不同的产品。

现在,问题是我只想为每个品牌获取 1 件产品,不超过 1 件,并且 1 件产品是根据最低价格获取的。 如何在 Django ORM 中实现它?

注意:如果一个品牌没有产品,那么该品牌不应该获取!

在这里,我尝试过但效果不佳。

def price_chart(request, category_slug):
    labels = []
    price_data = []
    price_analysis_data = Product.objects.filter(brand__category__category_slug = category_slug).values('brand__brand_name').annotate(
       Min('product_price')
    ).order_by('-product_price')
    for data in price_analysis_data:
        labels.append(data['brand__brand_name'])
        price_data.append(data['product_price'])
    return JsonResponse(data={
        'labels': labels,
        'price_data': price_data,
    })

请给我一个好的解决方案!

【问题讨论】:

  • 您使用的是哪个数据库?
  • @AKS Mysql 数据库
  • 有一个使用 distinct(*fields) 的解决方案,它只适用于 postgres。它没有 Mysql 的替代品。
  • 哦,那没有办法解决这个问题?
  • 有一些技巧可以应用。另一个问题,在视图中,您将标签和价格作为单独的数组返回。你不需要这两者之间的关系吗?

标签: django django-models django-views django-orm


【解决方案1】:

我们可以同时订购品牌名称(增加)和价格(减少):

brand_name_to_min_price_map = dict(
    Product.objects.filter(
        brand__category__category_slug=category_slug,
    ).order_by(
        'brand__brand_name', '-product_price',
    ).values_list(
        'brand__brand_name', 'product_price',
    )
)

因为我们将值列表放在字典中,所以它将创建一个键值对(品牌名称到价格)。如果品牌名称重复,后面的值将覆盖前面的值。在这种情况下,对于每个品牌,将使用列表中最后出现的产品价格。由于我们在每个品牌中按照产品价格的降序排列结果,所以最后的价格总是最低的。

【讨论】:

  • 它在'-product_price'附近显示一些语法错误
  • 有一个错字,因为brand_name 没有结束引号。我已经修好了。
  • 了不起的人!你做得很好非常感谢。你太棒了:)
  • 实际上还有 1 个帮助,现在无法正确显示数据,请参阅我想实现类似的目标示例 2:Ajax 条形图simpleisbetterthancomplex.com/tutorial/2020/01/19/…
  • 从字典中,您可以轻松地获取单独列表中的键和值。如果需要,您可以使用items() 方法将它们作为列表获取。
猜你喜欢
  • 2018-04-26
  • 2014-02-05
  • 2015-11-05
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-05
相关资源
最近更新 更多