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

2021-06-14 23:49:02 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在创建一个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来实现这一点?或者像生成相同或非常相似结果的替代查询?你知道吗