2011-05-05 94 views
0

我的查询无法正常工作。当我选择男性部分,然后age_from到age_to和date_from到date_to其实不从我的数据库根据我的查询实际选择男性,根据我的数据库男性记录在5岁至15岁之间,日期2011-04-05 2011-05-05只有1个,但显示3条记录。django查询不匹配

这是我的查询:如下 病人= PatientInfo.objects.filter(dateedit__range =(date_from,DATE_TO),age__range =(AGE_FROM,AGE_TO),gender__iexact = '男')

我觉得这是一些错误的,我查询..即时通讯NT,恰好...

标志= 0 如果request.POST.has_key( '性别'): search_gender = request.POST [ “性别”]

if search_gender == 'male': 
     flag == 1 

    if search_gender == 'female': 
     flag == 2 

    if search_gender == 'both': 
     flag == 3 

age_from = request.POST["age_from"] 
age_to = request.POST["age_to"] 
date_from = request.POST["date_from"] 
date_to = request.POST["date_to"] 

患者=患者信息()

if date1 and date2: 
    if age1 and age2: 
      if flag == 1: 
       patient = PatientInfo.objects.filter(dateedit__range=(date_from,date_to),age__range=(age_from,age_to),gender__iexact='male') 
      else: 
        patient = PatientInfo.objects.filter(dateedit__range=(date_from,date_to),age__range=(age_from,age_to)) 
        if flag == 2: 
         patient = PatientInfo.objects.filter(dateedit__range=(date_from,date_to),age__range=(age_from,age_to),gender__iexact='female') 
        else: 
         patient = PatientInfo.objects.filter(dateedit__range=(date_from,date_to),age__range=(age_from,age_to)) 
         if flag == 3: 
          patient = PatientInfo.objects.filter(dateedit__range=(date_from,date_to),age__range=(age_from,age_to),gender__iexact='male') 
+0

三个指针 - 1您可以逐位建立查询,添加额外的过滤器 - 2 - 为您的性别使用带有“choices”参数的char或integer字段。 - 3 - 使用'elif'整理东西 – Joe 2011-05-05 12:28:32

+0

将上面的注释转化为答案 – Joe 2011-05-05 12:34:26

+0

[django filter check conditions]的可能重复(http://stackoverflow.com/questions/5787265/django-filter-check-conditions) – 2011-05-05 13:16:50

回答

1

你可以建立由位查询一下,增加额外的过滤器,当您去。这将清理你的逻辑。另外,elif是你的朋友。此外,下次使用CHOICES来评估性别等值。

我没有测试过这一点,但是这是那种语法的你想

query = PatientInfo.objects.all() 

if date1 and date2: 
    query = query.filter(dateedit__range=(date_from,date_to)) 

if flag == 1: 
    query = query.filter(gender__iexact='male') 
elif flag == 2: 
    query = query.filter(gender__iexact='female') 

然后用query正常。意识到查询对象与结果集不同。在向查询中添加内容时,只会更改将转换为SQL的查询表达式树。只有当你执行它(把它变成一个列表,迭代等),它才会查询数据库并转换成结果集。所以不要害怕重构逻辑来调整查询对象。

另外请注意,您正在比较字符串与int。如果你想获得整数值,你想要thing = int(request.POST['thing'])

+0

没有问题是在查询中显示不正确的记录。实际上它是男性之间2011年1月5日至2011年5月5日之间的唯一记录和年龄5至15它根据我的数据库记录时,即时通讯在MySQL中手动运行它显示正确的记录,但根据上述我的代码显示3我认为有一些性别错误_iexact ='男'我认为它也选择女性PLZ帮助我没有得到哪里我错了... ... thanx – gur 2011-05-05 12:41:20

+0

那么,为一开始,当出现这样的问题时,你的逻辑很复杂,难以理解。尝试用这种风格的代码替换它,看看它是否有效。 – Joe 2011-05-05 12:46:02

+0

另外,您从POST获取字符串并将它们与整数进行比较。 '“1”!= 1'。 – Joe 2011-05-05 12:51:33