2017-10-15 36 views
0

我有一個簡單的數據庫表:

公司
如何添加一個選項來查看Django中的所有(*)?

'CompanyID', 'int(10) unsigned', 'NO', 'PRI', NULL, 'auto_increment' 
'CompanyName', 'varchar(70)', 'NO', '', NULL, '' 
'Type', 'enum(\'C\',\'M\',\'S\',\'A\')', 'NO', 'MUL', NULL, '' 
'Country', 'varchar(60)', 'YES', 'MUL', NULL, '' 
'Website', 'varchar(60)', 'YES', '', NULL, '' 
'Email', 'varchar(60)', 'YES', '', NULL, '' 
'Telephone', 'double unsigned', 'YES', '', NULL, '' 
'Maps_Link', 'varchar(60)', 'YES', '', NULL, '' 



CompanyDetails

'CompanyDetailsID', 'int(10) unsigned', 'NO', 'PRI', NULL, 'auto_increment' 
'CompanyID', 'int(10) unsigned', 'NO', 'MUL', NULL, '' 
'Type', 'enum(\'C\',\'M\',\'A\',\'S\')', 'NO', '', NULL, '' 
'Category', 'enum(\'MEP Consultant\',\'Lighting Designer\',\'Architect\',\'Interior Designer\',\'MEP Contractor\',\'Fitout Contractor\',\'Procurement Company\',\'Developer\',\'Outdoor-Architectural\',\'Indoor-Architectural\',\'Indoor-Decorative\',\'Outdoor-Decorative\',\'Lamps\',\'Drivers\',\'Control Systems\',\'Landscaping Consultant\',\'Landscaping Contractor\',\'Other\')', 'NO', '', NULL, '' 
'Comments', 'blob', 'YES', '', NULL, '' 

和3個表(聯繫,大陸,產品

我已經創建了一個應用CompanyBrowser。我試圖做一個簡單的形式爲下拉菜單:

  • 類型(從公司)
  • 類別(從公司詳細信息)
  • 國家(從公司)

對於其中每一個,我希望用戶可以選擇在下拉菜單中選擇全部(*)。

這裏是我的urls.py:

urlpatterns=[url(r'^$',views.Index,name='index'), 
url(r'^(?P<company_type>[CMSA*])/$',views.ResultsView.as_view(), name='results'), 
url(r'^(?P<company_type>[CMSA*])/(?P\<company_category>\w+)/$',views.ResultsView.as_view(), name='results'), 
url(r'^(?P<company_type>[CMSA*])/(?P<company_category>\w+)/(?P<company_country>\w+)/$',views.ResultsView.as_view(), name='results'), 
]<br> 

基本上,我會根據URL CompanyBrowser/COMPANY_TYPE/company_category/company_country,其中用戶可以輸入*,即所有任何搜索字段來顯示。

這是ResultsView我迄今編碼:

class ResultsView(generic.ListView): 
    template_name='CompanyBrowser/results.html' 
    context_object_name="results_of_company_type_query" 
    def get_queryset(self): 
     print(len(self.kwargs)) 
     if len(self.kwargs)==1: 
      if self.kwargs['company_type']!="*": 
       return Company.objects.filter(companytype=self.kwargs['company_type']) 
      else return Company.objects.all() 
     elif len(self.kwargs)==2: 
      if self.kwargs["company_type"]=="M": 
       if self.kwargs["company_category"]=="Indoor-Decorative": 
        return Company.objects.filter(companytype=self.kwargs['company_type'], companydetails__category=self.kwargs['company_category']) 

什麼是優雅的方式來做到這一點,而不是做的,如果別人的每個組合?我認爲如果有一個選項可以在過濾器查詢中輸入全部內容,那麼這可能很容易完成,也許?

+0

我相信在過濾器查詢中使用包含可能會有所幫助。 – user1926852

+0

使用contains的代碼對我來說工作得很好。唯一的問題是按國家查詢,因爲我的國家是一個外國關鍵。有什麼建議麼? – user1926852

回答

0
def get_queryset(self): 
    for i in self.kwargs: 
     if self.kwargs[i]=="*": 
      self.kwargs[i]="" 
    print(self.kwargs) 
    print(len(self.kwargs)) 
    if len(self.kwargs)==1: 
     queryset= Company.objects.filter(country__country__contains=self.kwargs['country']) 
     print (queryset.query,"\n", len(queryset)) 
     return queryset 
    elif len(self.kwargs)==2: 
     queryset= Company.objects.filter(country__country__contains=self.kwargs['country'], 
     companytype__contains=self.kwargs['company_type']) 
     print (queryset.query,"\n", len(queryset)) 
     return queryset 
    elif len(self.kwargs)==3: 
     queryset= Company.objects.filter(country__country__contains=self.kwargs['company_country'], 
     companytype__contains=self.kwargs['company_type'], 
     companydetails__category__contains=self.kwargs['company_category'],) 
     print (queryset.query,"\n", len(queryset) ) 
     return queryset 

這就是現在的工作。我使用的地方包含無處不在,這樣如果搜索項是空字符串,我的查詢將返回所有對象。另外,由於國家是來自歐洲大陸的外鍵。我使用country__country__contains

1

你可能想要這樣寫。另外,你很可能希望使用一個單獨的表單,將GET請求作爲「過濾器」。

class ResultsView(generic.ListView): 
    template_name='CompanyBrowser/results.html' 
    context_object_name="results_of_company_type_query" 

    def get_queryset(self): 
     if self.kwargs.get('company_type') == 'M' and self.kwargs.get("company_category") == "Indoor-Decorative": 
      return Company.objects.filter(companytype="M", companydetails__category="Indoor-Decorative") 
     elif self.kwargs.get('company_type') != '*': 
      return Company.objects.filter(companytype=self.kwargs['company_type']) 
     else: 
      return Company.objects.all() 
相關問題