将PostgreSQL重写为Django ORM

将PostgreSQL重写为Django ORM,django,postgresql,django-orm,Django,Postgresql,Django Orm,如果可以在没有原始SQL的情况下将此PostgreSQL查询重写为Django ORM,我自己尝试过,但没有成功 这是该基金的模式 class Fund(models.Model): name = models.CharField(max_length=320, unique=True) fund_manager = models.CharField() .............. 这是NAV的模型 class NAV(models.Model): pri

如果可以在没有原始SQL的情况下将此PostgreSQL查询重写为Django ORM,我自己尝试过,但没有成功

这是该基金的模式

class Fund(models.Model):
    name = models.CharField(max_length=320, unique=True)
    fund_manager = models.CharField()
     .............. 
这是NAV的模型

class NAV(models.Model):
    price = models.DecimalField(max_digits=9, verbose_name=_('NAV'))
    date = models.DateField(verbose_name=_('date'))
    fund = models.ForeignKey('Fund', related_name='navs')
    created_date = models.DateTimeField(default=now)
下面是sql查询,它可以工作,需要重写为Django ORM

select * from finance_fund ORDER BY(
  (select price from finance_nav where date='2016-11-08' and fund_id=finance_fund.id) / 
  (select price from finance_nav where date='2016-11-07' and fund_id=finance_fund.id)
)
所以基本上我需要按两个简单的外键向后关系查询的除法结果排序


提前谢谢

仅使用原始SQL。尝试以下方法:

qs = Fund.objects.annotate(x=RawSQL("""
    (select price from finance_nav where finance_fund.id=fund_id and date=%s limit 1) 
    / (select price from finance_nav where finance_fund.id=fund_id and date=%s limit 1)
    """,('2016-11-08', '2016-11-07'))).order_by('x')

那么,我以后能过滤它吗?例如
qs.filter()
Yes。你甚至可以参考
.x
.Wow,因此它返回普通查询集而不是原始查询集(objects.raw)。对我来说,问题似乎已经解决了。我每个基金的NAV都有唯一的日期,所以imho
限制1
在这里是多余的。所以你也可以在一起添加一个唯一的_=
(('Fund','date'),
)到NAV:-)