如何将2种不同的模型与“中间模型”结合起来?

时间:2019-05-11 21:10:20

标签: python django django-templates

我正在创建一个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来实现?还是像产生相同或非常相似结果的替代查询一样?

1 个答案:

答案 0 :(得分:0)

您可以使用原始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