Как сгруппировать товар по марке и получить минимальную цену товара в django - PullRequest
1 голос
/ 14 марта 2020

У меня есть две таблицы, одна из которых является брендом, а другая - продуктом, теперь продукт имеет 1 иностранную единицу brand_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,
    })

Пожалуйста, предложите мне хорошее решение!

1 Ответ

1 голос
/ 14 марта 2020

Мы можем заказать по названию бренда (по возрастанию) и по цене (по убыванию):

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',
    )
)

Поскольку мы помещаем список значений в диктовку, он создаст пару ключ-значение (название бренда для цена). Если название бренда повторяется, значение, которое придет позже, переопределит предыдущее значение. В этом случае для каждого бренда будет использоваться цена товара, которая появляется последней в списке. Поскольку мы упорядочили результаты в порядке убывания цены товара для каждой марки, последняя цена всегда будет минимальной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...