Подтвердить что ты не робот

"Невозможно отфильтровать запрос после того, как был сделан срез"

Я получаю эту ошибку

Caught 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 адресов. Он делает штраф, пока я не выберу адрес и не отправлю форму. Почему это не так? Как я могу обойти это?

4b9b3361

Ответ 1

Никто еще не ответил на вопрос: "Почему это не так?" часть вашего вопроса. Объяснение приведено в https://docs.djangoproject.com/en/1.8/ref/models/querysets/:

хотя нарезка необоснованного QuerySet возвращает еще один неопытный QuerySet, изменение его далее (например, добавление большего количества фильтров или изменение порядка) не допускается, поскольку это не очень хорошо переводится в SQL, и оно также не имеет четкого смысла.

Ответ 2

Я не знаю, как решить вашу проблему (кажется, у вас уже есть), но я думаю, именно поэтому вы получаете ошибку: https://docs.djangoproject.com/en/1.4/ref/models/querysets/

". Как поясняется в разделе Ограничение запросов QuerySet, QuerySet может быть нарезанный, используя синтаксис массива Python. Нарезка неоценимой QuerySet обычно возвращает еще один неопытный QuerySet, но Django будет выполните запрос базы данных, если вы используете параметр" шаг" среза синтаксис и вернет список. Нарезка QuerySet, которая была (частично или полностью) также возвращает список.

Я предполагаю, что вы вынуждаете набор запросов оцениваться с помощью среза, так что дальнейшая фильтрация приводит к ошибке?

Ответ 3

Я получил подобную ошибку, вытащив часть запроса из кода и затем отфильтровывая ее на следующей строке.

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

Не уверен, что это будет работать с вашим кодом.

Ответ 4

Это то, что в конечном итоге сработало для меня

_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
    )
)