预取对象和切片

时间:2017-12-11 09:41:09

标签: django django-queryset

我正在尝试在Prefetch对象中做一个切片

  def get_queryset(self):
        qs = super().get_queryset()
        return qs.prefetch_related(
            Prefetch('products', queryset=Product.objects.order_by('-updated_at', '-created_at')[:3]))

但是我收到以下错误:

Cannot filter a query once a slice has been taken.

我发现了以下帖子:prefetch_related with limit 但解决方案,在我的情况下不起作用,使用timedelta,你不知道你得到了多少。

此问题还有3年多的时间,所以我希望,在此期间,一些解决方案可以对Django进行更改(支持多个数据库)

在跟踪器中有一个使用Window的解决方案:

Prefetch(
    'post_set',
    queryset=
        Post.objects
        .annotate(_rank=Window(Rank(), partition_by='category')
        .filter(_rank__lte=3)
)

但我不知道除了PostgreSQL之外的Window支持,也不知道如何找到Rank。

我正在考虑使用额外的帮助。

1 个答案:

答案 0 :(得分:1)

我已经对您所关联的内容进行了评论。似乎项目中的人都知道这个问题。 Look hereThis comment建议找到一种解决方法来限制查询。