Django空时过滤Q问题

时间:2019-05-26 10:58:26

标签: django django-rest-framework django-views

我在过滤数据并将结果显示在表格中时遇到问题...

在模板中,我有一些输入,它们使用ajax发送输入值,然后在视图中使用<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <form onsubmit="addRow(event)"> <input type="text" name="name"> <input type="text" name="age"> <button>Add row</button> </form> <table id="customers_table"> <tr> <th>name</th> <th>age</th> </tr> </table> </body> <script> function addRow(event){ event.preventDefault(); let name = event.target.name.value let age = event.target.age.value var table = document.getElementById("customers_table") var row = document.createElement("tr"); var nameTd = document.createElement("td"); nameTd.innerText = name; var ageTd = document.createElement("td"); ageTd.innerText = age; row.appendChild(nameTd); row.appendChild(ageTd); table.appendChild(row); } </script> </html> 来获取值。当某些字段为空时出现问题,我收到错误消息“无法将None用作查询值”

我想做这样的事情,但是我找不到解决方法

例如当request.POST.get()为空时,request.POST.get将被忽略 谁能帮我? 谢谢你,对不起我的英语

这是我views.py中的代码

Q

1 个答案:

答案 0 :(得分:2)

我们可以创建一个仅针对非None值创建Q-object [Django-doc]的函数,例如:

from django.db.models import Q

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

或者如果您也想排除空字符串:

from django.db.models import Q

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

然后我们可以像这样构造查询:

raport_pacient = Pacient.objects.filter(
    q_without_none(
        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
    )
)
  

注意:尽管不是您真正的问题,但将JsonResponsesafe=False结合使用,正如其名称所示,并不是很安全。已经有exploits with lists for JSON,因此通常最好在顶层定义字典,例如:

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