gpt4 book ai didi

python - 针对同一模型原始查询的多个左连接和左连接转换为 Django ORM

转载 作者:行者123 更新时间:2023-11-28 18:59:48 24 4
gpt4 key购买 nike

使用 Django 1.11

我有以下模型:

class Vendor(Model):

class Product(Model):

class Pricebook(Model):

class Quote(Model):
vendor = models.ForeignKey(Vendor)

class SKU(Model):
product = models.ForeignKey(Product)
pricebook = models.ForeignKey(Pricebook)
vendor = models.ForeignKey(Vendor)

class SKUPrice(Model):
sku = models.ForeignKey(SKU, related_name="prices")

class LineItem(Model):
quote = models.ForeignKey(Quote, related_name="quote_line_items")
sku = models.ForeignKey(SKU)

这是适合我的原始查询。

SELECT 
qli.quantity,
sku_source.product_id,
sku_dest.id as sku_dest_id,
sku_dest_price.id as sku_dest_price_id
FROM lineitem qli
INNER JOIN sku sku_source ON
qli.sku_id = sku_source.id
LEFT JOIN sku sku_dest ON
sku_dest.pricebook_id = sku_source.pricebook_id AND
sku_dest.product_id = sku_source.product_id
LEFT JOIN skuprice sku_dest_price ON
sku_dest_price.status = 'default' AND
sku_dest_price.sku_id = sku_dest.id
WHERE qli.quotation_id = 40 AND
qli.quantity > 0 AND
sku_dest.vendor_id = 38;

我试过的是:

(the_quote_with_id_as_40
.quotation_line_items
.filter(quantity__gt=0)
.select_related('sku__product')
.values('sku__product__id', 'quantity')
)

这会产生这个查询

SELECT "sku"."product_id", "lineitem"."quantity"
FROM "lineitem"
INNER JOIN "sku" ON ("lineitem"."sku_id" = "sku"."id")
WHERE ("lineitem"."quotation_id" = 40 AND
"lineitem"."quantity" > 0)

这不是我想要的。

我当然可以使用原始查询。但我想知道是否可以使用 ORM。至少,这是为了增长我的知识。

谢谢。

更新

由于有人要求澄清我的模型,所以我写了以下内容。

我有一个 Quote 对象。它允许许多 LineItem 对象。每个 LineItem 与 SKU 和 Quote 是一对多的。

一个 SKU 属于一个价格手册,一个产品和一个供应商。这些关系的描述也可以从上面的代码中收集到。

但为了清楚起见,我将在这里重复。

这种安排使得单个相同的产品可以由不同的供应商销售,但它们将显示为不同的 SKU。

这是设计使然。

我们的用例是这样的:用户试图将特定报价单的 LineItem 复制到不同的报价单。

在用户心目中,他们不具备理解 SKU、LineItem 或产品之间差异的成熟度。

他们心目中的都是产品。他们只是希望相同的产品出现在具有相同数量的不同报价单中。

挑战是这样的。我们现在有两个报价单(一个要从中复制的源报价单和一个要复制到的目标报价单)。两个报价单可能有相同的供应商。或者他们可能不会。用户希望我的 Django 应用程序自动满足这两种情况。

所以这意味着我需要在复制之前找出以下内容。

  • LineItem 中说明的数量
  • LineItem 中相对于 SKU 所述的产品
  • 找到供应商为目标报价销售的相应 SKU
  • 及其对应的单价

原始查询允许我在单个查询中提取所有 4 条信息。这是高效的。

因此您看到我有别名 sku_sourcesku_dest

这就是为什么我的 WHERE 条件包含 3 个条件:

  1. 只会复制数量 > 0 的源行项目
  2. 只会复制来自特定来源报价单的 LineItems
  3. 只会调查针对特定供应商(在本例中为目标报价的供应商)的 SKU

有可能:

  1. 同一产品(相对于 SKU)的多个 LineItem 将出现在同一源报价单中。

  2. 目标供应商(指目标报价的供应商)不销售源供应商销售的特定产品。因此我使用 LEFT JOIN。这意味着该特定产品不会被复制。

我希望这能解决问题。

最佳答案

对我来说,您处理问题的方式不正确。

您仍在尝试解释查询,而不是您需要的对象。使用 ORM 时,您需要停止考虑查询,并开始考虑对象,以及它们如何相互播放/交互。通过这样做,您将把业务逻辑放在代码(模型、管理器等)中,而不是放在查询中。您不想在查询中加入业务逻辑然后开始思考,好吧,我现在该如何创建这个查询?具有哑查询的智能对象更容易被其他人优化和理解,而不是具有哑代码(对象)的智能查询。

从对象开始,编写代码,然后对其进行优化。

如果你向我展示一个未优化的面向对象版本,说明你如何/需要什么来制作这些副本,我可能会向你展示如何优化它。

在此之前,不要完全偏离主题,请尝试这个查询,但我不能保证它就是您要查找的内容:

quote.quotation_line_items.filter(
quantity__gt=0,
sku__vendor__sku__vendor=38,
sku__vendor__sku__product=models.F('sku__product'),
sku__vendor__sku__pricebook=models.F('sku__pricebook'),
).values(
'quantity',
'sku__product_id', # sku source product_id
'sku__vendor__sku__id', # sku dest id
'sku__vendor__sku__skuprice__id' # sku dest skuprice id
)

关于python - 针对同一模型原始查询的多个左连接和左连接转换为 Django ORM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53968892/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com