django как фильтровать данные перед экспортом в csv - PullRequest
1 голос
/ 28 февраля 2020

Я очень новичок в django. Сейчас я работаю над своим первым очень простым приложением. У меня есть рабочий фильтр:

def filter_view(request):
    qs = My_Model.objects.all()
    index_contact_contains_query = request.GET.get('index_contact_contains')
    nr_order_contains_query = request.GET.get('nr_order_contains')
    user_contains_query = request.GET.get('user_contains')
    date_min = request.GET.get('date_min')
    date_max = request.GET.get('date_max')

    if is_valid_queryparam(index_contact_contains_query):
        qs = qs.filter(index_contact__icontains = index_contact_contains_query)

    elif is_valid_queryparam(nr_order_contains_query):
        qs = qs.filter(nr_order__icontains = nr_order_contains_query)

    elif is_valid_queryparam(user_contains_query):
        qs = qs.filter(nr_user = user_contains_query)

    if is_valid_queryparam(date_min):
        qs = qs.filter(add_date__gte = date_min)

    if is_valid_queryparam(date_max):
        qs = qs.filter(add_date__lt = date_max)

    if export == 'on':
        ?????????????? - export file 

    context = {
        'queryset':qs
    }
    return render(request,'filter.html',context)

У меня также есть рабочая функция для экспорта данных в CSV-файл:

def download_csv(request):
    items = My_Model.objects.all()
    response = HttpResponse(content_type='text/csv')
    response['Content-Disposition'] = 'attachment; filename="export.csv"'

    writer = csv.writer(response)
    writer.writerow(['index_contact','nr_order','result','nr_user','tools','add_date'])

    for obj in data:
        writer.writerow([obj.index_contact, obj.nr_order, obj.result, obj.nr_user, obj.tools, obj.add_date])

    return response

У меня вопрос ... как соединить обе функции и экспортировать CSV файл с отфильтрованными данными.

У меня также есть запрос ... Пожалуйста, дайте мне подсказку, как для начинающего

Спасибо за любые предложения

Ответы [ 2 ]

0 голосов
/ 03 марта 2020

Первое спасибо за это. Я пытался это, но не работал, потому что я забыл добавить

return response

в разделе

if export == 'on':

Теперь работает почти так, как я хочу. Теперь, когда я отмечу «экспорт» в моих формах, файл будет загружен, и программа завершит работу с этой функцией. Я хотел бы, чтобы после отметки «экспорт» файл загрузки и фильтрация данных были одновременно.

Я прошу еще одно предложение. Спасибо

0 голосов
/ 28 февраля 2020

Вы можете "встроить" логи c из функции просмотра download_csv:

def filter_view(request):
    qs = My_Model.objects.all()
    index_contact_contains_query = request.GET.get('index_contact_contains')
    nr_order_contains_query = request.GET.get('nr_order_contains')
    user_contains_query = request.GET.get('user_contains')
    date_min = request.GET.get('date_min')
    date_max = request.GET.get('date_max')
    <b>export</b> = request.GET.get('export')

    if is_valid_queryparam(index_contact_contains_query):
        qs = qs.filter(index_contact__icontains = index_contact_contains_query)

    elif is_valid_queryparam(nr_order_contains_query):
        qs = qs.filter(nr_order__icontains = nr_order_contains_query)

    elif is_valid_queryparam(user_contains_query):
        qs = qs.filter(nr_user = user_contains_query)

    if is_valid_queryparam(date_min):
        qs = qs.filter(add_date__gte = date_min)

    if is_valid_queryparam(date_max):
        qs = qs.filter(add_date__lt = date_max)

    if export == 'on':
        response = HttpResponse(content_type='text/csv')
        response['Content-Disposition'] = 'attachment; filename="export.csv"'
        writer = csv.writer(response)
        writer.writerow(['index_contact','nr_order','result','nr_user','tools','add_date'])
        for obj in <b>qs</b>:
            writer.writerow([obj.index_contact, obj.nr_order, obj.result, obj.nr_user, obj.tools, obj.add_date])
        return response

    context = {
        'queryset':qs
    }
    return render(request,'filter.html',context)
...