[英]Python/Django - How to annotate a QuerySet with a value determined by another query
Django 1.11,Python 2.7,PostgreSQL
我有一组看起来像这样的模型:
class Book(Model):
released_at=DateTimeField()
class BookPrice(Model):
price = DecimalField()
created_at = DateTimeField()
假设Book和BookPrice有多个条目(在不同的时间点创建),我想获得一个Book
的QuerySet,其注释为Book发行时的当前BookPrice.price
值。 就像是:
books = Book.objects.annotate(
old_price=Subquery(BookPrice.objects.filter(
created_at__lt=OuterRef('released_at')
)
.order_by('created_at')
.last()
.price
)
)
当我尝试类似的操作时,出现错误: This queryset contains a reference to an outer query and may only be used in a subquery.
我可以很容易地通过for循环获取数据,但是我正在尝试为CSV下载准备大量数据,如果可以帮助,我不想遍历每本书。
您的问题是您正在执行.last().price
。 此代码解析(执行)查询并尝试获取python对象。 因此,当您尝试执行的查询包含OuterRef
,您将收到该错误,因此无法执行。
您应该将查询转换为以下内容:
last_price_before_release_query = BookPrice.objects.filter(created_at__lt=OuterRef('released_at')).order_by('-created_at').values('price') # Note the reversed ordering
books = Book.objects.annotate(old_price=Subquery(last_price_before_release_query[:1]))
您可以在此处获得更多信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.