Django Orm 中的所有 SQL 联合

问题描述 投票:0回答:1

我目前正在从事一个项目,其中我有下面描述的表格,使用下表我想查询将显示剩余库存位置所以我想在 Django ORM 中使用

Union All
,通过使用
union all
在查询中,我将管理我的股票头寸,我已经运行了
SQL
查询,我也在下面进行了描述,产生了预期的结果。

class PurchaseHeader(models.Model):
    purchase_no = models.CharField(max_length=100, unique=True)
    date = models.DateField(default=datetime.date.today)
    footer_description = models.TextField()
    payment_method = models.CharField(max_length=100)
    cartage_amount = models.DecimalField(max_digits=8, decimal_places=2)
    additional_tax = models.DecimalField(max_digits=8, decimal_places=2)
    withholding_tax = models.DecimalField(max_digits=8, decimal_places=2)
    account_id = models.ForeignKey(ChartOfAccount, models.SET_NULL, blank=True, null=True)


class PurchaseDetail(models.Model):
    item_code = models.CharField(max_length=100)
    item_name = models.CharField(max_length=100)
    item_description = models.TextField()
    unit = models.CharField(max_length=100)
    quantity = models.IntegerField()
    cost_price = models.DecimalField(max_digits=8, decimal_places=2)
    retail_price = models.DecimalField(max_digits=8, decimal_places=2)
    sales_tax = models.DecimalField(max_digits=8, decimal_places=2)
    purchase_id = models.ForeignKey(PurchaseHeader, on_delete=models.CASCADE)


class PurchaseReturnHeader(models.Model):
    purchase_no = models.CharField(max_length=100, unique=True)
    date = models.DateField(default=datetime.date.today)
    footer_description = models.TextField()
    payment_method = models.CharField(max_length=100)
    cartage_amount = models.DecimalField(max_digits=8, decimal_places=2)
    additional_tax = models.DecimalField(max_digits=8, decimal_places=2)
    withholding_tax = models.DecimalField(max_digits=8, decimal_places=2)
    account_id = models.ForeignKey(ChartOfAccount, models.SET_NULL, blank=True, null=True)

class PurchaseReturnDetail(models.Model):
    item_code = models.CharField(max_length=100)
    item_name = models.CharField(max_length=100)
    item_description = models.TextField()
    unit = models.CharField(max_length=100)
    quantity = models.IntegerField()
    cost_price = models.DecimalField(max_digits=8, decimal_places=2)
    retail_price = models.DecimalField(max_digits=8, decimal_places=2)
    sales_tax = models.DecimalField(max_digits=8, decimal_places=2)
    purchase_return_id = models.ForeignKey(PurchaseReturnHeader, on_delete=models.CASCADE)


class SaleHeader(models.Model):
    sale_no = models.CharField(max_length=100, unique=True)
    date = models.DateField(default=datetime.date.today)
    footer_description = models.TextField()
    payment_method = models.CharField(max_length=100)
    cartage_amount = models.DecimalField(max_digits=8, decimal_places=2)
    additional_tax = models.DecimalField(max_digits=8, decimal_places=2)
    withholding_tax = models.DecimalField(max_digits=8, decimal_places=2)
    account_id = models.ForeignKey(ChartOfAccount, models.SET_NULL, blank=True, null=True)


class SaleDetail(models.Model):
    item_code = models.CharField(max_length=100)
    item_name = models.CharField(max_length=100)
    item_description = models.TextField()
    unit = models.CharField(max_length=100)
    quantity = models.IntegerField()
    cost_price = models.DecimalField(max_digits=8, decimal_places=2)
    retail_price = models.DecimalField(max_digits=8, decimal_places=2)
    sales_tax = models.DecimalField(max_digits=8, decimal_places=2)
    sale_id = models.ForeignKey(SaleHeader, on_delete=models.CASCADE)


class SaleReturnHeader(models.Model):
    sale_no = models.CharField(max_length=100, unique=True)
    date = models.DateField(default=datetime.date.today)
    footer_description = models.TextField()
    payment_method = models.CharField(max_length=100)
    cartage_amount = models.DecimalField(max_digits=8, decimal_places=2)
    additional_tax = models.DecimalField(max_digits=8, decimal_places=2)
    withholding_tax = models.DecimalField(max_digits=8, decimal_places=2)
    account_id = models.ForeignKey(ChartOfAccount, models.SET_NULL, blank=True, null=True,)


class SaleRetutnDetail(models.Model):
    item_code = models.CharField(max_length=100)
    item_name = models.CharField(max_length=100)
    item_description = models.TextField()
    unit = models.CharField(max_length=100)
    quantity = models.IntegerField()
    cost_price = models.DecimalField(max_digits=8, decimal_places=2)
    retail_price = models.DecimalField(max_digits=8, decimal_places=2)
    sales_tax = models.DecimalField(max_digits=8, decimal_places=2)
    sale_return_id = models.ForeignKey(SaleReturnHeader, on_delete=models.CASCADE)

我想做这样的查询

SELECT item_code, SUM(quantity) AS qty FROM (
    SELECT 'Purchase' AS TranType,Item_Code,Quantity FROM transaction_purchasedetail
    UNION All
    SELECT 'Purchase Return' AS TranType,Item_Code,Quantity * -1 FROM transaction_purchasereturndetail
    UNION All
    SELECT 'Sale' AS TranType,Item_Code,Quantity * -1 FROM transaction_saledetail
    UNION All
    SELECT 'Sale Return' AS TranType,Item_Code,Quantity  FROM transaction_saleretutndetail
) AS tblTemp GROUP BY Item_Code

我在 DB Browser SQLite 中运行了上面的 SQL 查询,我得到了预期的结果 我怎样才能在 Django ORM 中做到这一点。

python mysql sql django-models django-orm
1个回答
0
投票

https://docs.djangoproject.com/en/4.2/ref/models/querysets/#union

union
有一个
all
kwargs:

qs.union(another_qs, all=True)
© www.soinside.com 2019 - 2024. All rights reserved.