Я создаю HTML-таблицу, в которой будет отображаться список доступных товаров на разных складах. Но товар (конечно) не привязан напрямую к складу. Это связано с прикладом третьей модели. Идея состоит в том, что я создаю таблицу, и в крайнем левом столбце у вас будет список продуктов с вертикальными столбцами со складскими запасами.
Проблема возникает, когда не все склады могут иметь этот товар. Так что они не появятся в базе данных. Пример: продукт X никогда не попадет на склад A, поэтому соответствующая запись о запасе не будет создана.
Я уже кое-что успешно пробовал, и это работает, но мне кажется, что это действительно плохой код. Определенно, поскольку шаблоны Django должны быть максимально простыми. Это не:
class Product(models.Model):
name = models.CharField(....
class Warehouse(models.Model):
name = models.CharField(....
class Stock(models.Model):
product = models.ForeignKey(Product...
warehouse = models.ForeignKey(Warehouse...
quantity = models.CharField(....
@register.simple_tag # I'll get to this
def get_k_v(l, key, v):
try:
return l.get(**{key: v})
except:
return None
Что я делаю сейчас, я перебираю продукты и внутри каждого цикла строк по всем складам, используя обратный вызов функции, если она существует, я показываю количество, если это не так, ячейка станет серой (на данный момент может изменение).
Визуализация:
{% for product in products %}
<tr>
<td>{{ product }}</td>
{% for warehouse in warehouses %}
{% get_k_v product.stock_set 'warehouse' warehouse as ware_prod %}
{% if ware_prod %} ...
Как вы можете себе представить и, возможно, согласитесь со мной, даже если это работает, это выглядит плохо, и я бы сказал, что это действительно плохо с точки зрения производительности. У нас в базе 300+ товаров, и загрузка с 10 складов занимает уже пару секунд.
Поскольку я (пока) не настолько продвинут в Django, мне интересно, как я могу это улучшить.
РЕДАКТИРОВАТЬ: Я пытался решить эту проблему и создал запрос, который выводит запрошенный результат. Это выглядит так:
SELECT products.id, products.name, warehouses.id, warehouses.name, stock.quantity
FROM products CROSS JOIN warehouses
LEFT JOIN stock ON stock.product_id = products.id AND stock.warehouse_id = warehouses.id
Есть ли способ реализовать это с помощью Django ORM? Или как альтернативный запрос, который дает такой же или очень похожий результат?