Skip to main content
 首页 » 编程设计

python之django 复合查询集

2024年09月03日26lori

我有这个过滤机制,但它不是很优雅。必须有更好的方法来写这个。如有任何建议,我们将不胜感激。

用户可以从多个过滤器中进行选择来过滤列表:

表单.py

class FilterForm(forms.Form): 
    def __init__(self, *args, **kwargs): 
        super(FilterForm, self).__init__(*args, **kwargs) 
        self.fields['group'].widget.attrs["onchange"] = mark_safe('this.form.submit();') 
        self.fields['location'].widget.attrs["onchange"] = mark_safe('this.form.submit();') 
        self.fields['host'].widget.attrs["onchange"] = mark_safe('this.form.submit();') 
        self.fields['exchange'].widget.attrs["onchange"] = mark_safe('this.form.submit();') 
    group = forms.ModelChoiceField(queryset=Group.objects.all().order_by('name'), ) 
    location = forms.ModelChoiceField(queryset=Location.objects.all().order_by('name'), ) 
    host = forms.ModelChoiceField(queryset=Host.objects.all().order_by('name'), ) 
    exchange = forms.ModelChoiceField(queryset=Exchange.objects.all().order_by('name'), ) 

views.py

initial = {} 
#check for filtering 
if 'group' in request.POST: 
    if request.POST['group']: 
        initial['group'] = request.POST['group'] 
        obj = Group.objects.get(pk=request.POST['group']) 
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(group=obj) 
if 'host' in request.POST: 
    if request.POST['host']: 
        initial['host'] = request.POST['host'] 
        obj = Host.objects.get(pk=request.POST['host']) 
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(host=obj) 
if 'location' in request.POST: 
    if request.POST['location']: 
        initial['location'] = request.POST['location'] 
        obj = Location.objects.get(pk=request.POST['location']) 
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(colo=obj) 
if 'exchange' in request.POST: 
    if request.POST['exchange']: 
        initial['exchange'] = request.POST['exchange'] 
        obj = Exchange.objects.get(pk=request.POST['exchange']) 
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(exchange=obj) 
 
filterForm.initial = initial 

请您参考如下方法:

initial = dict(request.POST) 
# The dictionary key is the field name retrieved from the POST request 
# The first list item is the model to query 
# The second list item is the "jobs" field to query 
dict_models = {'group': [Group, 'group']], 
    'host': [Host, 'host'], 
    'location': [Location, 'colo'], 
    'exchange': [Exchange, 'exchange'], 
    } 
 
#check for filtering 
for k, v in dict_models.items(): 
    if initial.get(k, None): 
        obj = v[0].objects.get(pk=initial[k]) 
        kwargs = v[1] 
        for key in kwargs.keys: 
            kwargs[key] = obj 
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(**kwargs) 
 
filterForm.initial = initial