当多个输入可以为空时,在 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 [重复]