我正在尝试在 django 中实现搜索。
我的观点如下:
search_term = request.GET['search_term']
customers = Customer.objects.filter(
Q(chassis__icontains=search_term) | Q(registration__icontains=search_term) |
Q(email__icontains=search_term) | Q(firstname__icontains=search_term) |
Q(lastname__icontains=search_term))
calculations_data = []
if customers:
for customer in customers:
try:
calculation = Calculations.objects.get(customer=customer, user=request.user)
calculations_data.append({
'calculation': calculation,
'price': price_incl_vat(calculation.purchase_price),
'customer_fullname': '{} {} '.format(customer.firstname, customer.lastname),
'car_chassis': customer.chassis,
'car_registration': customer.registration,
})
except Calculations.DoesNotExist:
pass
context = {'search_term': search_term, 'total_result': len(calculations_data), 'calculation_data': calculations_data}
return render(request, 'master/search.html', context)
我有两个模型:计算
和客户
。在计算内部我有客户作为外键,但它可以为空。因此,每次计算都不需要有客户。
在我的示例中,如果我有搜索词
,结果很好,但如果没有搜索词,那么我只能得到有客户的计算结果。
但是我需要的是,如果没有search_term,我想获得所有计算结果。
是否有更好的方法来编写查询?
谢谢。
最佳答案
由于结果取决于 search_term
的可用性,因此为什么不在 search_term
上使用 if-else
。
search_term = request.GET.get('search_term', None)
if search_term:
# when search term is not None
# get relevant calculations
else:
calculations = Calculations.objects.all()
# rest of code
当 search_term
不为 None
时,您可以通过将 Q
对象直接放入 Calculations.objects 中来进一步简化代码。 filter()
本身(而不是获取相关客户,然后查找相关计算)。在 Django 中,您可以查询Q
对象中外键的属性。您首先获取客户,然后使用这些结果来查找计算。这将增加对数据库的查询数量。
您可以执行以下操作:
calculations = Calculations.objects.filter(
Q(customer__email__icontains=search_term) |
Q(customer__chassis_icontains=search_term)|
Q(....)).select_related('customer')
关于python - Django 查询数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42388638/