OuterRef和Subquery无法使用日期时间过滤器检索数据

时间:2019-11-22 23:08:34

标签: django django-orm

我有一个用例,其中我尝试使用以下模型计算给定金额和历史价格的某些交易的总价值:

class Transaction(models.Model): 
    ...
    asset = models.ForeignKey('Asset', ...)
    amount = models.FloatField()
    date = models.DateTimeField()
    ...

class Price(models.Model): 
    ...
    asset = models.ForeignKey('Asset', ...)
    price = models.FloatField()
    date = models.DateTimeField()
    ...

我想做的是,它通过查询获取所有交易,并通过子查询注释历史价格:

from django.db.models.expressions import Subquery, OuterRef

price_at_date = Price.objects.filter(
                      date=OuterRef('date'), 
                      asset=OuterRef('asset')).values('price')

transactions = Transaction.objects.filter(...).annotate(hist_price=Subquery(price_at_date)) 

这将为hist_price返回None。我怀疑这与日期时间不匹配(时间不同但日期相同)有关。我尝试将date的任何组合替换为date__date,但这仍然无法正常工作,并在None中返回了hist_price

有人知道如何通过Django ORM /查询获得同一日期(而不是时间)的历史价格吗?

谢谢!

1 个答案:

答案 0 :(得分:3)

我发现了下一个案例:

from django.db.models.expressions import Subquery, OuterRef
from django.db.models.functions import Cast
from django.db.models import DateField

price_at_date = Price.objects.filter(date__date=OuterRef('date_date'), asset=OuterRef('asset')).values('price')

transactions = Transaction.objects.filter(...).annotate(date_date=Cast('date', DateField())).annotate(hist_price=Subquery(price_at_date))

主要思想是用类似的 DateField(在 DateTimeField 附近)注释一个查询集,并将其用于 OuterRef。