当多个输入可以为空时,在 Django 中使用 Q 进行过滤

Posted

技术标签:

【中文标题】当多个输入可以为空时,在 Django 中使用 Q 进行过滤【英文标题】:Filter using Q in Django , when multiple inputs can be null 【发布时间】:2020-03-23 09:59:27 【问题描述】:

我有一个模型 product_details,包含以下字段 brand_name、model_name、bodystyle、transmission 和 min_price、max_price

下拉列表中的预算值示例是

1 - 5
5 - 10
10 - 15

我有 5 个选择下拉字段,我想根据这些字段过滤我的结果。

我正在使用下面的方法根据前三个字段进行过滤

def select(request):
    q1 = request.GET.get('brand')
    q2 = request.GET.get('model')
    q3 = request.GET.get('bodyStyle')
    #q4 = request.GET.get('budget')


    cars = product_details.objects.filter(Q(bodystyle__icontains=q3)|Q(brand_name__icontains=q1)|Q(model_name__icontains=q2))


    #cars = product_details.objects.filter(bodystyle=q3)
    return render(request, 'search/search_results.html', 'cars': cars)

我有两个问题

1:如果从下拉列表中仅选择 1 或 2 个值,我如何过滤。我的 if 条件应该是什么? 2. 如何根据预算字段的范围进行筛选?由于预算需要与 min_price 和 max_price 进行比较。

任何帮助或指导将不胜感激。

模型定义:

class product_details(models.Model):

    product_id=models.ForeignKey(products, on_delete=models.CASCADE)
    model_id=models.ForeignKey(product_models, on_delete=models.CASCADE)
    variant_id=models.CharField(primary_key=True,max_length=10)

    brand_name=models.CharField(max_length=255, blank=True, null=True)
    model_name=models.CharField(max_length=255, blank=True, null=True)
    variant_descr=models.CharField(max_length=255, null=True, blank=True)

    transmission=models.CharField(max_length=255, blank=True, null=True)
    bodystyle=models.CharField(max_length=255, blank=True, null=True)


    min_price=models.FloatField(blank=True, null=True)
    max_price=models.FloatField(blank=True, null=True)

【问题讨论】:

回答:***.com/questions/7006862/… 谢谢,这对我的问题 1 有帮助。您能指导我回答问题 2 吗? 如果您提供模型病帮助您 【参考方案1】:

请尊重 python CamelCase 命名约定:

class ProductDetails(models.Model):
# ...

对于问题 2:

selected_min_price= 50
selected_max_price=200
ProductDetails.objects.filter(additional_filters=...).filter(min_price__gt=selected_min_price, max_price__lt=selected_max_price)

见Object.filter(property__lt=...)

【讨论】:

【参考方案2】:

ProductDetails.objects.filter(max_price__lte=200, min_price__gte=100)

【讨论】:

【参考方案3】:

您可以多次过滤您的查询集,以根据所选过滤器应用多个条件,例如:

cars = product_details.objects.all()

if q1:
    cars = cars.filter(brand_name__icontains=q1)

if q2:
    cars = cars.filter(model_name__icontains=q2)

if q3:
    cars = cars.filter(bodystyle__icontains=q3)

对于预算,您可以使用相同的技术,如果选择了预算,首先拆分范围的两个值(最小值,最大值),然后再次过滤您的查询集:

if q4:
    budget_min, budget_max = q4.split(' - ')
    cars = cars.filter(
        min_price__gte=int(budget_min),
        max_price__lte=int(budget_max),
    )

【讨论】:

以上是关于当多个输入可以为空时,在 Django 中使用 Q 进行过滤的主要内容,如果未能解决你的问题,请参考以下文章

当过滤字符串为空时,如何停止 Graphql + Django-Filters 返回所有对象?

我有一种形式可以更新mysql中的某些值,当输入为空时,如何避免更新单元格?

当输入字段为空时,Javascript 计算返回 NaN [重复]

sql server 2008环境中,字段为decimal(18,2),当输入为空时,会报错。

仅当特定输入为空时,如何禁用按钮?

当一个或多个变量为空时,如何将多个变量发送到 laravel 中的视图