我收到此错误
渲染时捕获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个地址。它呈现正常,直到我选择一个地址并提交表格。为什么不喜欢这个?我怎么能绕过它?
答案 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
)
)