Django - 使用可选的 FormFields 过滤查询集

菲德

假设我有一个模型:

class House(models.Model):
    (...)
    price = models.DecimalField(decimal_places=2, max_digits=8)
    area = models.DecimalField(decimal_places=2, max_digits=6)

我有一个用于搜索房屋的表格:

class SearchHouseForm(forms.Form):
    price_min = forms.DecimalField(required=False, initial=0, decimal_places=2, max_digits=8)
    price_max = forms.DecimalField(required=False, initial=999999, decimal_places=2, max_digits=6)

和视图函数:

def search_for_houses(request):
    queryset = House.objects.all()

    if request.method == 'GET' and 'search-submit-button' in request.GET:
        form = SearchHouseForm(request.GET)
        if form.is_valid():
            queryset = queryset.filter(
                price__lte = form.cleaned_data['price_max'],
                price__gte = form.cleaned_data['price_min']
            )
    else:
        (...)
    return render(request, template, {'house_list': queryset, 'form': form})

我有.filter()-ing的问题当且仅当用户在表单字段中提供任何值时,我想应用过滤器。如果该price_max字段留空,则只price__gte = form.cleaned_data['price_min']应应用 。如果price_maxprice_min都留空,House则应返回所有对象。目前我得到ValueError Cannot use None as a query value

有没有干净的方法来做到这一点?我唯一能想到的是if所有这些可选字段的一长串语句:

if form.cleaned_data['price_max'] is not None:
    queryset = queryset.filter((...))
if form.cleaned_data['price_min'] is not None:
    queryset = queryset.filter((...))
(...)

这似乎不是一个好主意,特别是如果我想应用大量这样的可选过滤字段。

迪克格罗滕

在只有两个过滤器的情况下,我会按照你的建议继续使用if ...条件。

但如果您想在未来构建更复杂的查询,请考虑使用Q对象。这里有一篇很好的博客文章其中展示了一些示例。例如,您可以创建一个过滤器字典,并循环遍历您的字段并在字段值已填充时添加 Q 过滤器。

这个方向的东西:

queries = {'price_max': "price__lte", 'price_min': "price__gte"}
predicates = []
for field, value in cleaned_data.items():
    if value and field in queries:
        predicates.append((queries[field], value))
q_list = [Q(x) for x in predicates]
queryset = queryset.filter(reduce(operator.and_, q_list))

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

使用有限的子查询过滤 Django 查询集

是否可以使用查询集过滤外键?Django的

Django-是否使用某些参数过滤了查询集

Django使用字段值查找过滤查询集

Django-使用子对象过滤查询集(ForeignKey)

Django 使用 URL 过滤 ModelChoiceField 查询集以填充表单

使用 values() 时过滤 Django 查询集的相关 ManyToMany 字段

使用 AJAX 和 Django Rest Framework 动态过滤查询集

使用 ORM Django 过滤新更新的查询集返回空的查询集

如何使用FormFields的WTForms FieldList?

过滤 Django ResourceRelatedField 的查询集

Django过滤查询集模型

Django如何使用Django模型utils通过子类过滤查询集?

如何在不使用 distinct 方法的情况下在 Django 中获取不同的过滤查询集?

使用多个检查过滤查询集,包括Django视图中的value_is_in数组

如何仅使用CASE或COALESCE表达式过滤Django查询集?

Django - 使用另一个模态字段过滤查询集

Django通过使用字典值过滤从数据库表返回查询集

使用对象过滤查询集

Django - 多过滤查询集返回空查询集

Django 使用 Q 过滤查询

组合Django查询集的过滤器

Django-用户定义的查询集过滤

Django - 如何过滤嵌套查询集的子项?

Django - 附加后过滤查询集

Django 查询集过滤和注释

使用与用户匹配的两个条件之一来过滤查询集。Django Rest框架

如何在 django-filter 中的多个字段上使用一个查找字段过滤查询集

使用SQL查询过滤数据集