Я пытаюсь построить MultipleChoiceFilter
, где варианты выбора представляют собой набор возможных дат, которые существуют в связанной модели (DatedResource
).
Вот с чем я сейчас работаю ...
resource_date = filters.MultipleChoiceFilter(
field_name='dated_resource__date',
choices=[
(d, d.strftime('%Y-%m-%d')) for d in
sorted(resource_models.DatedResource.objects.all().values_list('date', flat=True).distinct())
],
label="Resource Date"
)
Когда это отображается в виде HTML ...
Сначала это работает нормально, однако, если я создаю новые объекты DatedResource
с новыми различными значениями date
, мне нужно перезапустить мой веб-сервер, чтобы они были выбраны в качестве действительного выбора в этом фильтре. Я считаю, что это потому, что список choices
вычисляется один раз при запуске веб-сервера, а не каждый раз, когда загружается моя страница.
Есть ли способ обойти это? Может быть, благодаря некоторому творческому использованию ModelMultipleChoiceFilter
?
Ой!
Edit:
Я попробовал простое использование ModelMultipleChoice
, но столкнулся с некоторыми проблемами.
resource_date = filters.ModelMultipleChoiceFilter(
field_name='dated_resource__date',
queryset=resource_models.DatedResource.objects.all().values_list('date', flat=True).order_by('date').distinct(),
label="Resource Date"
)
HTML-форма показывается очень хорошо, однако выбор не является допустимым значением для фильтра. Я получаю "2019-04-03" is not a valid value.
ошибок проверки, я предполагаю, потому что этот фильтр ожидает datetime.date
объектов. Я думал об использовании параметра coerce
, однако они не принимаются в фильтрах ModelMultipleChoice
.
Согласно комментарию Диркгротена, я пытался использовать то, что было предложено в связанном вопросе . В итоге получается что-то вроде
resource_date = filters.ModelMultipleChoiceFilter(
field_name='dated_resource__date',
to_field_name='date',
queryset=resource_models.DatedResource.objects.all(),
label="Resource Date"
)
Это также не то, что я хочу, так как форма HTML теперь представляет собой а) отображение str
представления каждого DatedResource
вместо поля DatedResource.date
и б) они не являются уникальными (например, если у меня есть два DatedResource
объекта с одинаковым date
, оба их str
представления отображаются в списке. Это также не является устойчивым, потому что у меня 200k + DatedResources
, и страница зависает при попытке загрузить их все (по сравнению с фильтр values_list
, способный вытягивать все отдельные даты за считанные секунды.