Есть такие модели:
class Goods(models.Model):
art = models.CharField(max_length=20, blank=True, null=True)
name = models.CharField(max_length=255, blank=True, null=True)
class PriceGroups(models.Model):
name = models.CharField(max_length=255, blank=True, null=True)
class Price(models.Model):
price = models.DecimalField(max_digits=10, decimal_places=2)
goods = models.ForeignKey(Goods, on_delete=models.CASCADE,)
pricegroup = models.ForeignKey(PriceGroups, on_delete=models.CASCADE)
Соответственно в таблице Price записи выглядят следующим образом:
|--------|--------------|-----|
|Goods_id|PriceGroups_id|Price|
|--------|--------------|-----|
| 1 | 1 | 20 |
|--------|--------------|-----|
| 1 | 2 | 25 |
|--------|--------------|-----|
| 1 | 3 | 30 |
|--------|--------------|-----|
| 2 | 1 | 40 |
|--------|--------------|-----|
| 2 | 2 | 45 |
|--------|--------------|-----|
| 2 | 3 | 50 |
|--------|--------------|-----|
Мне нужно получить результат выборки в виде:
|--------|----------------------|----------------------|----------------------|
|Goods_id|PriceGroups_id 1 price|PriceGroups_id 2 price|PriceGroups_id 3 price|
|--------|----------------------|----------------------|----------------------|
| 1 | 20 | 25 | 30 |
|--------|----------------------|----------------------|----------------------|
| 2 | 40 | 45 | 50 |
|--------|----------------------|----------------------|----------------------|
Используя objects.raw и запрос:
SELECT goods.id, PriceGroups_id_1.price, riceGroups_id_2.price,
PriceGroups_id_3.price
FROM price_goods AS goods
LEFT JOIN price_price AS PriceGroups_id_1 ON goods.id = PriceGroups_id_1.goods_id
LEFT JOIN price_price AS PriceGroups_id_2 ON goods.id = PriceGroups_id_2.goods_id
LEFT JOIN price_price AS PriceGroups_id_3 ON goods.id = PriceGroups_id_3.goods_id
WHERE PriceGroups_id_1.pricegroup_id = 1
AND PriceGroups_id_2.pricegroup_id = 2
AND PriceGroups_id_3.pricegroup_id = 3
Я получаю нужный результат.
Можно ли как-то сделать это с помощью ORM?
Для одного вида цены получается через такой код:
Goods.objects.filter(price__pricegroup_id = 1).annotate(PriceGroups_id_1_price = F('price__price'))
Но как это сделать для нескольких видов цен не понимаю.