2013-10-03 75 views
1

我有一个FormChoiceField字段可以为空(假设“所有选定的”)或具有一定的值的表单。Single QuerySet选择一些记录或所有记录

什么是创建选择所有记录或一些记录,而不使用的if-else语句单查询集的最佳方式?

目前我使用的是这样的:

class MyForm(forms.Form): 
    operators = forms.ModelChoiceField(
     queryset=EpayOperators.objects.all(), 
     label="Choose operator", 
     empty_label="All", 
     required=False) 
    ... 

查看

# Any security and validation checks are ommited 
... 
if request.POST.get('operators'): 
    # Some operator was selected 
    payments = Transactions.objects.filter(date=my_date, sum=my_sum, operator=MyForm.cleaned_data['operators']) 
else: 
    # None selected, display all operators 
    payments = Transactions.objects.filter(date=my_date, sum=my_sum) 

我觉得这不是Python的方式来做到这一点:使用if-else和两个分隔查询。

有什么办法可以创建一个单一的,多功能的查询?

什么是正确的方法来做到这一点?

谢谢。

回答

0

你可以这样做:

filter_args = {} 
filter_args['date'] = my_date 
filter_args['sum'] = my_sum 
if request.POST.get('operators'): 
    filter_args['operator'] = MyForm.cleaned_data['operators'] 
payments = Transactions.objects.filter(**filter_args) 

但是你的代码是明确的,因为它是那么我不知道这提高了你的代码。

+0

谢谢西蒙。我的问题是,这两个查询使用**过滤器()**和他们有相同的字段,除了**运营商**。我已经更新了问题的代码。 – Lufa

+0

@Lufa:这并没有什么不同,因为您可以相应地填充'filter_args'。我会更新我的答案。 –

+0

明白了。 ** kwargs看起来更优雅。 TNX! – Lufa