«Невозможно отфильтровать запрос после того, как был взят фрагмент» - PullRequest
18 голосов
/ 12 августа 2010

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

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

Ответы [ 4 ]

12 голосов
/ 04 мая 2015

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

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

4 голосов
/ 01 апреля 2012

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

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

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

2 голосов
/ 01 апреля 2011

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

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

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

1 голос
/ 14 сентября 2013

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

_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
    )
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...