Python Django-我可以在没有原始查询的情况下执行此操作吗

Python Django-我可以在没有原始查询的情况下执行此操作吗,python,sql,django,Python,Sql,Django,我正在学习Django,在使用StackOverflow上的文档和各种其他帖子方面已经走了很长的路,但是我现在有点卡住了。基本上,我想按如下方式查询数据库: SELECT w.wname, w.act_owner_id, wi.act_code, wi.act_provider, SUM(ft.quantity) AS "position", prices.Current, prices.MonthEnd, prices.Y

我正在学习Django,在使用StackOverflow上的文档和各种其他帖子方面已经走了很长的路,但是我现在有点卡住了。基本上,我想按如下方式查询数据库:

SELECT 
    w.wname,
    w.act_owner_id,
    wi.act_code, 
    wi.act_provider, 
    SUM(ft.quantity) AS "position", 
    prices.Current,
    prices.MonthEnd,
    prices.YearEnd,
    cost.avgcost,
    sec.securityName AS "security" 
FROM 
    finance_wrapperinstance as wi
INNER JOIN finance_wrapper as w ON
    (w.id = wi.wrapperType_id)
INNER JOIN finance_security as sec ON
    (ft.security_id = sec.id)
left outer JOIN finance_transaction as ft ON 
    (wi.id = ft.investwrapperID_id) 
left outer Join 
    (SELECT
        hp.security_id as secid,
        max(Case when hp.date = '2019-11-18' then hp.price end) as 'Current',
        max(Case when hp.date = '2019-10-30' then hp.price end) as 'MonthEnd',
        max(Case when hp.date = '2018-12-31' then hp.price end) as 'yearEnd'
    FROM finance_historicprice as hp
    GROUP BY hp.security_id
    ) AS prices ON 
    (prices.secid =ft.security_id)
INNER JOIN 
    (SELECT
        trans.security_id AS secid,
        trans.investwrapperID_id as iwID,
        SUM((CASE WHEN trans.buysell = 'b' THEN trans.quantity ELSE 0 END)* trans.price) /
        SUM(CASE WHEN trans.buysell = 'b' THEN trans.quantity ELSE 0 END) AS avgCost
    FROM 
        finance_transaction as trans
    GROUP BY
        trans.security_id,
        trans.investwrapperID_id) AS cost ON
        (cost.secid = ft.security_id and cost.iwID = wi.id)

GROUP BY 
    w.wname,
    wi.wrapperType_id, 
    wi.act_code, 
    wi.act_provider, 
    ft.security_id
但是我不知道如何使用Django ORM获取我的价格子查询或成本子查询

模型如下所示:


任何帮助或指点都将不胜感激。另外,我还有一些函数,可以为SQL查询选择要输入的正确日期。这再次让我认为,原始方法可能是一条可行之路

请从业务角度描述您的问题。对于如此复杂的select,原始SQL可能比Django等价物(如果存在的话)更干净。我不太懂SQL,但我擅长ORM。如果你告诉我你想要什么,我可以试试。我试图展示证券及其当前价格、月末价格、年末价格和证券的平均成本。每个用户都会有一个包装器,无论是ISA、pension等,我想得到每个包装器的每种证券的数量以及与之相关的所有价格。我不敢尝试转换。请从业务角度描述您的问题。对于如此复杂的select,原始SQL可能比Django等价物更干净,如果它存在的话。我不太懂sql,但我擅长ORM。如果你告诉我你想要什么,我可以试试。我试图展示证券及其当前价格、月末价格、年末价格和证券的平均成本。每个用户都有一个包装器,无论是ISA、养老金等,我想得到每个包装器的每种证券的数量以及与之相关的所有价格,我不敢尝试转换。
class Wrapper(models.Model):
    wname = models.CharField(max_length=50,null=False,verbose_name="Wrapper Name")
    act_owner = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE)

class Wrapperinstance(models.Model):
    wrapperType = models.ForeignKey(Wrapper,on_delete=models.CASCADE)
    act_code = models.CharField(max_length=50,null=False, verbose_name="Account Code")
    act_provider = models.CharField(max_length=50,null=False,verbose_name="Account Provider")

class Security(models.Model):
    securityName    = models.CharField(max_length=200,null=False,verbose_name="Security Name")
    securityType    = models.ForeignKey(InstrumentType,on_delete=models.CASCADE)

class Transaction(models.Model):
    BUY = 'b'
    SELL = 's'
    BUY_SELL_CHOICES = [
        (BUY, 'Buy'),
        (SELL, 'Sell'),
    ]

    security        = models.ForeignKey(Security,default=1,on_delete=models.CASCADE)
    investwrapperID = models.ForeignKey(Wrapperinstance,default=1,on_delete=models.CASCADE)
    quantity        = models.DecimalField(max_digits=14, decimal_places=4)
    buysell         = models.CharField(max_length=2,choices=BUY_SELL_CHOICES, default = BUY)
    price           = models.DecimalField(max_digits=14, decimal_places=2)


class HistoricPrice(models.Model):
    security        = models.ForeignKey(Security,default=1,on_delete=models.CASCADE)
    date            = models.DateField()
    price           = models.DecimalField(max_digits=14, decimal_places=2)