2011-03-18 140 views
0

聰明的方法我缺少CS和缺乏經驗的實在是嶄露頭角的這一刻。我從來沒有真正處理過濾結果服務器端。我在想這不是正確的做法。我使用Django ....過濾服務器端

首先,我認爲我可以通過保持此驗證我的形式定義保持乾燥。接下來,我擔心我的鏈式過濾器語句。在這一點上,使用Q複數查找有多重要,而不是鏈接過濾器?我只是建立一個原型,並且我認爲我最終必須尋找一種比全文搜索更強大的搜索解決方案。

我的大問題,現在(除了代碼並明確了效率低下的長度)是,我不知道如何處理我的房間和工作人員的投入,這是選擇的形式。如果用戶沒有選擇一個值,我想從流程服務器端刪除這些過濾器。我應該爲這些結果創建兩個單獨的有條件的查找系列嗎?

def search(request): 
    if request.method=='GET' and request.GET.get('region',''): 
      neighborhoods=request.GET.getlist('region') 
     min_rent=request.GET.get('min_cost','0') 
     min_rent=re.sub(r'[,]','',min_cost) #remove any ',' 
     if re.search(r'[^\d]',min_cost): 
      min_cost=0 
     else: 
      min_cost=int(min_cost) 

     max_cost=request.GET.get('max_cost','0') 
     max_cost=re.sub(r'[,]','',max_cost) #remove any ',' 
     if re.search(r'[^\d]',max_cost): 
      max_cost=100000 
     else: 
      max_cost=int(max_rent) 


     date_min=request.GET.get('from','') 
     date_max=request.GET.get('to','') 
     if not date_min: 
      date=(str(datetime.date.today())) 
      date_min=u'%s' %date 
     if not date_max: 
      date_max=u'2013-03-18' 

       rooms=request.GET.get('rooms',0) 
     if not rooms: 
     rooms=0 

     workers=request.GET.get('workers',0) 
     if not workers: 
      workers=0 

    #I should probably use Q objects here for complex lookups 
    posts=Post.objects.filter(region__in=region).filter(cost__gt=min_cost).filter(cost__lt=max_cost).filter(availability__gt=date_min).filter(availability__lt=date_max).filter(rooms=rooms).filter(workers=workers) 
    #return HttpResponse('%s' %posts) 

    return render_to_response("website/search.html",{'posts':posts),context_instance=RequestContext(request)) 

回答

2

首先,我認爲我可以通過保持此驗證我 形式定義保持 機。

是的,我會把它放在一個窗體中,因爲它看起來像你用一個來顯示窗體?另外,您可以在clean_FIELD方法中將很多日期格式化的東西放在格式cleaned_data字典中的數據。這裏唯一的問題是輸出實際上被修改了,所以你的用戶會看到1000到1000之間的變化。不管怎樣,我會把這個邏輯放在一個表單方法中。

# makes the view clean. 
if form.is_valid(): 
    form.get_posts(request) 
    return response 

我的大問題,現在(除了 長度代碼並明確了 低效率的)是,我不知道如何 處理我的房間和工作人員的投入, 這是選擇的形式。如果用戶 不選擇一個值,我想從工藝 服務器端 刪除這些過濾器。我是否應該爲這些結果創建兩個 單獨的條件系列查找 ?

Q對象僅適用於複雜的查找。我在這裏看不到他們的需要。

我也不明白爲什麼你需要鏈中的過濾器。我首先想知道這些是否是m2m,但這些類型的查詢(__gt/__lt)沒有任何不同的鏈接,因爲查詢之間沒有重疊。

# this is more readable/concise. 
# I'd combine as many of your queries as you can just for readability. 
posts = Posts.objects.filter(
     region__in=region, 
     cost__gte=min_cost, 
     # etc 
    ) 

現在,如果您想要可選參數,我的建議是使用關鍵字參數字典,以便您可以動態地填充kwargs。

keyword_arguments = { 
    'region__in': region, 
    'cost__gte': min_cost, 
    'cost__lt': max_cost, 
    'availability__gt': date_min, 
    'availability__lt': date_max, 
} 

if request.GET.get('rooms'): 
    keyword_arguments['rooms'] = request.GET['rooms'] 

if request.GET.get('workers'): 
    keyword_arguments['workers'] = request.GET['workers'] 

posts = Posts.objects.filter(**keyword_arguments) 
+0

這裏有很多很好的信息。老實說,我已經閱讀了django文檔,並且我沒有意識到查詢方法可能需要多個參數(使用Q之外)。我不知道過濾器可以拿字典。 – Ben 2011-03-18 16:14:44

+0

非常感謝Yuji – Ben 2011-03-18 16:15:44

+0

嘿布倫丹,沒問題!該查詢不是取字典,「**」將字典擴展爲關鍵字 - 參數對,因此就該方法而言,它是通過關鍵字參數傳遞的,而不是字典。最後一個技巧對動態查詢非常有用! – 2011-03-18 16:22:58