如何在django中使用ChoiceField时过滤空字段



我有一个程序,用户应该能够通过他们的属性过滤不同类型的技术。我的问题是,当我用来过滤的参数中存在潜在冲突和空值时,我该如何过滤技术?

Forms.py:

class FilterDataForm(forms.ModelForm):
ASSESSMENT = (('', ''),('Yes', 'Yes'),('No', 'No'),)
q01_suitability_for_task_x = forms.ChoiceField(label='Is the technology suitable for x?',
choices=ASSESSMENT, help_text='Please select yes or no', required=False,)
q02_suitability_for_environment_y = forms.ChoiceField(label='Is the technology suitable for environment Y?',
choices=ASSESSMENT, help_text='Please select yes or no', required=False)

在我的模型中有许多像上面那样的字段。

views.py

class TechListView(ListView):
model = MiningTech
def get_queryset(self):
q1 = self.request.GET.get('q01_suitability_for_task_x', '')
q2 = self.request.GET.get('q02_suitability_for_environment_y', '')
object_list = MiningTech.objects.filter(q01_suitability_for_task_x=q1).filter(
q02_suitability_for_environment_y=q2)
return object_list

困难在于不是所有的技术数据库条目都有数据。因此,在我目前的设置中,有时我会过滤掉具有一个属性但不具有另一个属性的对象。

例如,如果我的数据库有:pk1: q01_suitability_for_task_x = Yes;q02_suitability_for_environment_y =是的;pk2: q01_suitability_for_task_x = Yes;q02_suitability_for_environment_y = ";

在表单中,如果我不为q01_suitability_for_task_x选择任何值,并为q02_suitability_for_environment_y选择Yes,我在查询集中什么也得不到,因为没有q01_suitability_for_task_x空字段。

任何帮助都会很感激。如果需要的话,我也可以重组一切。

问题是,如果没有找到值,您的self.request.GET.get(...)代码默认为空字符串,因此您的模型.filter()正在寻找字符串为''的匹配。

我将重构get_queryset()的第一部分,以构建一个可以解压缩到您的过滤器中的字典。如果值不存在,那么它就不会添加到字典过滤:

filters = {}
q1 = self.request.GET.get('q01_suitability_for_task_x', None)
q2 = self.request.GET.get('q02_suitability_for_environment_y', None)
if q1 is not None:
filters['q01_suitability_for_task_x'] = q1
... etc ...
object_list = MiningTech.objects.filter(**filters)

如果你有很多q1, q2等项,那么考虑把它们放在一个列表中,如果.get(...)返回任何值,循环并插入到字典中。

编辑:因为确实有很多可能的过滤器,最终的解决方案看起来如下:

def get_queryset(self):
filters = {}
for key, value in self.request.GET.items():
if value != '':
filters[key] = value
object_list =  Tech.objects.filter(**filters)

最新更新