2011-05-05 108 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