Я установил приложение Django, которое запрашивает базу данных PostgreSQL. Экспорт всех данных в модели кажется относительно простым, но что если я захочу экспортировать только данные из возвращенного набора запросов.
В настоящее время я управляю этим, имея кнопку на своей странице и меняя URL, когда пользователь хочет экспортировать данные. Код в представлении, которое я отображаю, выглядит следующим образом.
def export_data(request,pk):
resource_class = MDPResource()
queryset = MDP.objects.filter(mdp_id=pk)
dataset = person_resource.export(queryset)
response = HttpResponse(dataset.csv, content_type='text/csv')
response['Content-Disposition'] = 'attachment; filename="mdpbasic.csv"'
return response
Однако это означает, что я собираюсь сделать один запрос, когда пользователь первоначально откроет страницу, а затем второй запрос (в действительности 2 дополнительных), когда пользователь хочет экспортировать данные, к которым я уже запросил в предыдущий вид.
Кроме того, в разделе моей страницы я также использую модели Q для сложной фильтрации. Вышеуказанный метод недостаточен для экспорта данных в этом случае (я не хочу восстанавливать запрос).
Я также не хочу записывать данные в файл (если я могу помочь), потому что тогда возникает проблема необходимости удалять их с помощью os после того, как пользователь экспортирует свои данные.
Создание CSV-файла с помощью Django (динамический контент)
Я уже проверил этот вопрос, но я не уверен, как работает передача словаря в urlpattern, и все равно кажется, что запрос выполняется в любом случае еще один раз (все еще на один меньше, чем мой текущий метод).
Я не знаю, стоит ли мне проверять приложения для этой конкретной цели. Я изучил пару таких, как django-queryset-csv и django-import-export, но ни один из них, похоже, не выполняет то, что я упомянул.
django: экспортировать текущий набор запросов в csv нажатием кнопки в браузере
Я видел этот пример, который использует представления на основе классов, но я хотел посмотреть, есть ли способ сделать это с представлениями на основе функций, чтобы мне не пришлось переносить все мои представления на классы из них.