Как совместить 2 разные модели с «Модель посередине»? - PullRequest
0 голосов
/ 12 мая 2019

Я создаю таблицу 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

Есть ли способ реализовать это с помощью ORM Джанго?Или как альтернативный запрос, который дает такой же или очень похожий результат?

1 Ответ

0 голосов
/ 17 мая 2019

Вы можете использовать необработанный SQL:

from django.db import connection
query='SELECT app_product.id, app_product.name, app_warehouse.id, app_warehouse.name, app_stock.quantity \
       FROM app_product CROSS JOIN app_warehouse \
       LEFT JOIN app_stock ON app_stock.product_id = app_product.id AND app_stock.warehouse_id = app_warehouse.id'
with connection.cursor() as cursor:
   cursor.execute(query)
   result_table = cursor.fetchall()

Более подробная информация о необработанном SQL находится здесь: https://docs.djangoproject.com/en/2.2/topics/db/sql/#executing-custom-sql-directly

...