Django фильтрует проблему Q, когда пусто - PullRequest
1 голос
/ 26 мая 2019

У меня проблема с фильтрацией данных и отображением результата в таблице ...

В моем шаблоне есть входные данные, которые я отправляю входные значения с помощью ajax, а затем получаю значение с помощью request.POST.get()по моему мнению.Проблема появляется, когда некоторые поля пусты, я получаю сообщение об ошибке «Не могу использовать None в качестве значения запроса»

Я хочу сделать что-то подобное, но не могу найти решение

ex.когда request.POST.get пусто, чтобы Q было проигнорировано Кто-нибудь может мне помочь?Спасибо и извините за мой английский

Это мой код в моих views.py

def api(request):
    a = request.POST.get('a')
    b = request.POST.get('b')
    c = request.POST.get('c')
    d = request.POST.get('d')
    e = request.POST.get('e')
    f = request.POST.get('f')
    g = request.POST.get('g')
    h = request.POST.get('h')
    raport = Test.objects.filter(
        Q(data_test__year__gte=a) &
        Q(data_test__year__lte=b) &
        Q(data_in__isnull=c) &
        Q(data_out__isnull=d) &
        Q(adress__fieldone=e) &
        Q(adress__fieldtwo=f) &
        Q(categoru=g) &
        Q(stare=h) &
        Q(medic=i)
    )
    serializer = TestSerializer(raport, many=True)
    return JsonResponse(serializer.data, safe=False)

1 Ответ

2 голосов
/ 26 мая 2019

Мы можем создать функцию, которая создает Q -объект [Django-doc] только для значений, отличных от None, например:

from django.db.models import Q

def q_without_none(**kwargs):
    return Q(**{k: v for k, v in kwargs.items() <b>if v is not None</b>})

или, если вы также хотите исключить пустую строку:

from django.db.models import Q

def <b>q_without_empty</b>(**kwargs):
    return Q(**{k: v for k, v in kwargs.items() <b>if v not in (None, '')</b>})

Тогда мы можем построить запрос как:

raport_pacient = Pacient.objects.filter(
    <b>q_without_none(</b>
        data_creare_pacient__year__gte=de_la,
        data_creare_pacient__year__lte=pana_la,
        data_iesire__isnull=iesit,
        data_deces__isnull=iesit,
        adresa_pacient__judet__nume_judet=judet,
        adresa_pacient__localitate__nume_localitate=localitate,
        categorie=categorie,
        stare_civila=stare_civila,
        medic=request.user.medic
    <b>)</b>
)

Примечание : хотя на самом деле это не ваш вопрос, использование JsonResponse с safe=False, как следует из названия, не очень безопасно. Было эксплойтов со списками для JSON , поэтому обычно лучше определить словарь на верхнем уровне, например:

return JsonResponse({'data': serializer.data})
...