"切片拍摄后无法过滤查询"

mpe*_*pen 19 django

我收到这个错误

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

在这条线上

{% if form.non_field_errors %} 
Run Code Online (Sandbox Code Playgroud)

当我尝试这样做

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

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

mhs*_*ith 12

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

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


Sup*_*tch 5

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

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

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


use*_*061 5

这最终对我有用

_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
    )
)
Run Code Online (Sandbox Code Playgroud)