繁体   English   中英

Python / Django-如何用另一个查询确定的值注释QuerySet

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM