“切片拍摄后无法过滤查询”

时间:2010-08-12 16:56:42

标签: django

我收到此错误

  

渲染时捕获AssertionError:切片一旦被切换,就无法过滤查询。

在这一行

{% if form.non_field_errors %} 

当我尝试这样做时

copy_pickup_address = ModelChoiceField(required=False, queryset=Address.objects.filter(shipment_pickup__user=user).order_by('-shipment_pickup__created')[:5])

但我需要切片,因为我只想要最后5个地址。它呈现正常,直到我选择一个地址并提交表格。为什么不喜欢这个?我怎么能绕过它?

4 个答案:

答案 0 :(得分:11)

没有人回答“为什么不喜欢这个?”你问题的一部分。解释见https://docs.djangoproject.com/en/1.8/ref/models/querysets/

  

即使切片未评估的QuerySet返回另一个未评估的QuerySet,也不允许进一步修改它(例如,添加更多过滤器或修改排序),因为这不能很好地转换为SQL,也不会有明确的含义。

答案 1 :(得分:4)

我不知道如何解决您的问题(似乎您已经有)但我认为这就是您收到错误的原因:https://docs.djangoproject.com/en/1.4/ref/models/querysets/

  

“切片。如限制查询集中所述,QuerySet可以是   切片,使用Python的数组切片语法。切片未评估   QuerySet通常返回另一个未评估的QuerySet,但Django会   如果使用slice的“step”参数,则执行数据库查询   语法,并将返回一个列表。切片已经过的QuerySet   评估(部分或全部)也返回一个列表。“

我猜你是在强制使用切片评估查询集,以便进一步过滤会导致错误?

答案 2 :(得分:2)

通过拉出代码中的查询设置然后在下一行过滤它,我遇到了类似的错误。

query = Address.objects.filter(shipment_pickup__user=user).order_by('-shipment_pickup__created')
copy_pickup_address = ModelChoiceField(required=False, queryset=query[:5])

不确定这是否适用于您的代码。

答案 3 :(得分:1)

这最终对我有用

_latest_shipment_ids = [address.id for address in Address.objects.filter(shipment_pickup__user=user).order_by('-shipment_pickup__created')[:5]]
copy_pickup_address = ModelChoiceField(
    required=False,
    queryset=Address.objects.filter(
        shipment_pickup__user=user,
        id__in=_latest_shipment_ids
    )
)