如何添加一个选项来查看Django中的所有(*)?

时间:2017-10-15 14:36:40

标签: python django django-queryset

我有一个带表格的简单数据库:

公司

yum install ipa-gothic-fonts xorg-x11-fonts-100dpi xorg-x11-fonts-75dpi xorg-x11-utils xorg-x11-fonts-cyrillic xorg-x11-fonts-Type1 xorg-x11-fonts-misc -y



CompanyDetails

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

以及另外3个表格(联系人,大陆,产品

我创建了一个应用程序CompanyBrowser。我正在尝试使用下拉菜单创建一个简单的表单:

  • 类型(来自公司)
  • 类别(来自公司详情)
  • 国家(来自公司)

对于其中的每一个,我希望用户可以选择在下拉菜单中选择所有(*)。

这是我的urls.py:

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

基本上,我将根据url CompanyBrowser / company_type / company_category / company_country显示,其中用户可以输入*,即所有搜索字段的所有内容。

这是我到目前为止编码的ResultsView:

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>

这样做的优雅方法是什么,而不是做各种各样的组合?我想如果有一个选项可以在过滤器查询中输入所有内容,这可能很容易实现吗?

2 个答案:

答案 0 :(得分:1)

您可能想以这种方式编写它。此外,您最有可能希望使用单独的表单将GET请求作为&#34;过滤器&#34;。

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

答案 1 :(得分: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