【问题标题】:Filter using Q in Django , when multiple inputs can be null当多个输入可以为空时,在 Django 中使用 Q 进行过滤
【发布时间】: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)

【问题讨论】:

标签: python django django-queryset django-filter django-q


【解决方案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),
          )
      

      【讨论】:

        猜你喜欢
        • 2014-04-11
        • 2020-12-25
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2015-09-01
        • 2013-02-16
        • 2019-01-30
        • 2014-12-05
        相关资源
        最近更新 更多