2017-10-15 4 views
0

J'ai une simple base de données avec des tables:

Société
Comment ajouter une option pour tout voir (*) dans 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, '' 



SociétéDétails

'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, '' 

et 3 autres tables (Contactez, Continent, Produit)

J'ai créé une application CompanyBrowser. Je suis en train de faire une forme simple avec des menus déroulants pour:

  • type (de société)
  • Catégorie (de la société)
  • Pays (de la société)

Pour Dans chacun de ces cas, je souhaite que l'utilisateur ait la possibilité de sélectionner tout (*) dans le menu déroulant.

Voici mon 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> 

Fondamentalement, j'exposerons selon url CompanyBrowser/company_type/company_category/company_country, où l'utilisateur peut entrer * dire, tout pour tout le champ de recherche.

C'est le ResultsView j'ai codé jusqu'à présent:

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']) 

Quelle est une façon élégante de le faire au lieu de faire toutes les combinaisons de si elses? Je pense que cela pourrait être facilement fait s'il y avait une option pour entrer tout dans la requête de filtre, peut-être?

+0

Je crois que l'utilisation de contenu dans la requête de filtre pourrait aider. – user1926852

+0

Le code using contient fonctionne bien pour moi. Le seul problème que j'ai est l'interrogation par pays car mon pays est une clé étrangère. Aucune suggestion? – user1926852

Répondre

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 

Cela fonctionne maintenant. J'ai utilisé contient partout, de sorte que ma requête renvoie avec tous les objets si le terme de recherche est une chaîne vide. Aussi, puisque le pays est un étranger claveté de la table Continent. J'utilise country__country__contains.

1

Vous voulez probablement l'écrire de cette façon. En outre, vous souhaiterez probablement utiliser un formulaire distinct prenant la requête GET en tant que "filtre".

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()