Django 复合查询集

发布于 2024-11-08 20:50:40 字数 2179 浏览 3 评论 0原文

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

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

forms.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

I have this filtering mechanism that works, however, it is not very elegant. There has to be a better way to write this. Any recommendations would be greatly appreciated.

The user is able to select from multiple filters to filter the list:

forms.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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

可遇━不可求 2024-11-15 20:50:40
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
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
╰◇生如夏花灿烂 2024-11-15 20:50:40

你可以尝试一些类似的东西(未经测试)

options = {'group':Group, 'host':Host, 'location':Location, 'exchange':Exchange}
for key, modelclass in options.items():
    value = request.POST.get(key, None)
    if value:
        initial[key] = value
        obj = modelclass.objects.get(pk=value)
        filter = {}
        filter[key] = obj
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(**filter)

you could try something along the lines of (untested)

options = {'group':Group, 'host':Host, 'location':Location, 'exchange':Exchange}
for key, modelclass in options.items():
    value = request.POST.get(key, None)
    if value:
        initial[key] = value
        obj = modelclass.objects.get(pk=value)
        filter = {}
        filter[key] = obj
        selectForm.fields['job'].queryset = selectForm.fields['job'].queryset.filter(**filter)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文